十分钟了解分布式计算:Google Dataflow

2019-03-02 23:41|来源: 网路

介绍

Google Cloud Dataflow是一种构建、管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Flume和具有良好容错机制流处理的MillWheel。Dataflow当前的API还只有Java版本(其实Flume本身是提供Java/C++/Python多种接口的,MillWheel也提供Java/C++的API)。

相比原生的map-reduce模型,Dataflow有几个优点:

  1. 可以构建复杂的pipeline,在这不妨引用Google云平台的产品营销总监Brian Goldfarb的话

    Cloud Dataflow可以用于处理批量数据和流数据两种。在一个世界性事件(比如演讲当中的世界杯事件)中,实时分析上百万twitter数据。在流水线的一个部阶段责读取tweet,下一个阶段负责抽取标签。另一个阶段对tweet分类(基于情感,正面负面或者其他方面)。下一个阶段过滤关键词等等。相比之下,Map/Reduce这个用来处理大数据的较早模型,处理这种实时数据已经力不从心,而且也很难应用到这种很长很复杂的数据流水线上。

  2. 不需手工配置和管理MapReduce集群。自动进行代码优化和资源调度,使得开发者的主要精力可以放在业务逻辑本身

  3. 支持从Batch到Streaming模式的无缝切换:
    假设我们要根据用户在twitter上产生的内容,来实现一个hashtags自动补全的功能

    Example: Auto completing hashtags
    Prefix Suggestions
    ar #argentina, #arugularocks, #argylesocks
    arg #argentina, #argylesocks, #argonauts
    arge #argentina, #argentum, #argentine


    代码几乎和数据流一一对应,和单机程序的编写方式差别不大

    Dataflow将数据抽象为一个PCollections (“parallel collections”),PCollection可以是一个内存中的集合,从Cloud Storage读进来,从BigQuerytable中查询得到,从Pub/Sub以流的方式读入,或者从用户代码中计算得到。
    为了对PCollection进行处理,Dataflow提供了许多PTransforms (“parallel transforms”),例如ParDo (“parallel do”) 对于PCollection中每一个元素分别进行指定操作(类似MapReduce中的Map和Reduce函数,或者SQL中的WHERE),GroupByKey对一个key-value pairs的PCollection进行处理,将相同key的pairs group到一起(类似MapReduce中的Shuffle步骤,或者SQL中的GROUP BY和JOIN)。
    此外,用户还可以将这些基本操作组合起来定义新的transformations。Dataflow本身也提供了一些常用的组合transformations,如Count, Top, and Mean。
    这是一个经典的批处理的例子

    转化为streaming做法只需改动数据源。如果我们现在希望模型提供的是最新的热词,考虑数据的时效性,只需额外添加一行设置数据window的操作,比如说60min以前的数据我们就不要了

  4. Dashboard:
    还可以在developer console中了解流水线中每个环节执行的情况,每个流程框基本对应着一行代码

  5. 生态系统:
    BigQuery作为存储系统是Dataflow的一个补充,经过Dataflow清洗和处理过的数据,可以在BigQuery中存下来,同时Dataflow也可以读取BigQuery以进行表连接等操作。如果想在Dataflow上使用一些开源资源(比如说Spark中的机器学习库),也是很方便的

为了配合Dataflow,Google Cloud Platform还为开发者提供了一系列工具,包括云保存,云调试,云追踪和云监控。

比较

  1. Cascading/Twitter Scalding
    1) 传统Map-reduce只能处理单一的流,而Dataflow可以构建整个pipeline,自动优化和调度,Dataflow乍一听感觉非常像Hadoop上的Cascading(Java)/Scalding(Scala)。
    2) 它们的编程模型很像,Dataflow也可以很方便做本地测试,可以传一个模拟集合,在上面去迭代计算结果,这一点是传统Map-reduce望尘莫及的。
  2. Twitter Summingbird
    而将批处理和流处理无缝连接的思想又听起来很像把Scalding和Strom无缝连接起来的twitter summingbird(Scala).
  3. Spark
    1) Spark也有可以构建复杂的pipeline做一代码优化和任务调度的好处,但目前还需要程序员来配置资源分配。
    2) Spark在设计分布式数据集API时,模拟了Scala集合的操作API,使得额外的语法学习成本比Dataflow要低。
    3) 不过Dataflow似乎并没有提内存计算的事儿,而这一点可以说是Spark最本质的特征。不过它支持将Spark作为Open Source工具,连入Cloud框架作为补充。
    4) 分布式计算中除了Batch和Streaming,Graph也是一个重要的问题,Spark在这方面有GraphX,Dataflow在未来也会将处理Graph处理(Pregel)这块整合进去。

参考

本文的内容主要基于官方资料

Sneak peek: Google Cloud Dataflow, a Cloud-native data processing service

Google I/O 2014 - The dawn of "Fast Data"(国内用户下载)

链接

Google Cloud Dataflow 简单理解

Cloud Dataflow :云计算时代的新计算模式

Google Announces Cloud Dataflow Beta at Google I/O

Google Launches Cloud Dataflow, A Managed Data Processing Service

Mapreduce successor google cloud dataflow is a game changer for hadoop thunder

论文

FlumeJava: Easy, Efficient Data-Parallel Pipelines,PLDI,2010

MillWheel: Fault-Tolerant Stream Processing at Internet Scale,Very Large Data Bases (2013), pp. 734-746

转载请注明出处:
十分钟了解分布式计算:Google Dataflow


转自:http://www.cnblogs.com/wei-li/p/Dataflow

相关问答

更多
  • 感谢您对Dataflow编程模型的兴趣! 的确,Dataflow和Apache Storm都支持流处理,但是有一些重要的区别: Dataflow支持同一个“窗口化”API下的批量和流式计算,而据我所知,Storm就是一个流式系统。 用于定义计算拓扑的API在Dataflow和Storm中非常不同。 Dataflow API很大程度上模仿了FlumeJava :您可以像操作真实集合一样操纵逻辑PCollection对象(并行集合;您可以将其视为逻辑数据集),并根据将不同并行操作(如ParDo )应用到其他结果 ...
  • 我们一直在使用测试工具为我们的应用程序流程运行基准测试,但后来又恢复了将当前开箱即用的Google提供的PubSub基准测试到PubSub模板流程(请参阅: https ://cloud.google.com/dataflow/ docs / templates / overview虽然未在此处列出,但您可以从控制台创建它。 我们的测试工具生成并发送了数百个带有时间戳的数百字节JSON格式的消息,并比较了两端的延迟。 非常简单: 测试发布者 - > PubSub - >数据流 - > PubSub - >测 ...
  • 您可以在https://issues.apache.org/jira/browse/BEAM-214找到ParquetIO的进展(开箱即用的功能)。 与此同时,应该可以在Beam和Dataflow SDK中使用Hadoop FileInputFormat读取Parquet文件。 You can find progress towards ParquetIO (out of the box functinonality as you called it) at https://issues.apache.or ...
  • 为了使迁移更容易,我认为应该可以定义一个通用的Dataflow Transform,它可以包装Hadoop Mappers和Reducers,以便代码可以在Dataflow Pipelines中重用。 这是一个非常小的实现AvroMRTransform ,它充当AvroMapper和AvroReducer的包装器(即它只能用于Avro数据的输入和输出)。 AvroMRTransform可以工作,但几乎可以肯定它无法处理。 它也不支持一堆Hadoop功能,如计数器。 由于这些原因,我不建议将此作为临时停止间隙 ...
  • 看起来在Python中,选项是--max_num_workers 。 It looks like in Python the option is --max_num_workers.
  • 仅当为您要拨打的服务开发了Google Client Library for Go时,才建议使用自动生成的Google API for Go 。 Dataflow还没有客户端库。 要使用默认凭据从Go应用程序启动Dataflow模板: ctx := context.Background() oauthClient, err := google.DefaultClient(ctx, dataflow.CloudPlatformScope) dataflowService, err := dataflow.N ...
  • 我们认为Google Cloud Dataflow是开始使用大数据分析的绝佳场所。 我们从头开始构建它,简单易用。 有关其他数据处理技术的知识,例如MapReduce或Hadoop,可以帮助您入门,但它们在学习或使用Cloud Dataflow方面不会有太大的帮助。 但是,有了这样的背景,Cloud Dataflow提供的完全托管服务的好处将更加明显。 一个好的起点是我们的主页 。 你会在那里找到所有相关信息。 如果出现任何问题,请随意使用google-cloud-dataflow标记StackOverfl ...
  • 编码器是必要的,这样跑步者可以将PCollection临时存储并读回,而不是将其保存在内存中。 我想不出一个合理的方法来实现一个ZipInputStream对象 - 这是一个基本的概念问题,而不是一个Coder API问题。 但是,在您的特定情况下,我认为您只需在ZipWriter.write()函数中打开ZipInputStream ,并使ZipIO.Sink成为Sink而不是Sink 。 还有一件事我在代码中注意到了:我想你打算将这些代码用于位于GCS和 ...
  • 您可以使用KafkaIO.Read.withConsumerFactoryFn来提供将被调用以创建Kafka使用者的工厂函数。 在该功能中,您可以自由地执行任何操作,例如,您可以从GCS存储桶下载信任存储文件(我建议使用GcsUtil )并将其保存到本地磁盘上的临时文件中 - 仅限AFAIK Kafka支持在本地磁盘上拥有此文件。 然后手动创建KafkaConsumer并将其指向该文件。 You can use KafkaIO.Read.withConsumerFactoryFn to supply a f ...
  • 如果启用自动扩展 ,Dataflow将根据负载动态地提高或降低工作器数,而无需重新启动管道。 你可以在这里和这里阅读更多相关信息。 If you enable autoscaling, Dataflow will raise or lower the number of workers dynamically according to load, without restarting the pipeline. You can read more about it here and here.