Apache Beam研究报告

概述

本文不是一篇Beam的入门文档,不会介绍Beam的基本概念;而会主要探讨Beam的表达力,Beam的性能,以及Beam目前在业内的使用情况。面向的读者是那些想使用Beam作为自己公司操作大数据的统一API,但是还有所顾虑的人们。

表达力

离线

Beam里面有两个核心原语:

  • ParDo: 来处理通用的基于单条数据的计算: 每条需要处理的数据会被喂给用户提供的指定的一个函数(Beam里面的@ProcessElement), 然后输出0个或者多个输出。

    • 我们平常熟悉的Filter, AppendColumn等等都可以通过ParDo来实现。
    • ParDo的语义涵盖了Hadoop中Map-Shuffle-Reduce的Map,Reduce
  • GroupByKey: 用来做Grouping的操作。
    • 我们平常熟悉的Count, Sum, Min等等都可以通过GroupByKey来实现。
    • Group的语义涵盖了Hadoop中Map-Shuffle-Reduce的Shuffle

既然Map-Shuffle-Reduce这三个关键语义都被Beam涵盖了,你觉得它的表达力如何?

实时

对于GroupByKey操作,在实时场景下会有所不同:实时场景下我们不知道什么时候应该完成对某个key的group。因此GroupByKey被扩展成了更通用的: GroupByKeyAndWindow。这里的Window通常是按照时间来划分的,比如“小时窗口”,“5分钟窗口”。当窗口结束的时候,我们就认为GroupByKey说需要的所有的数据到到达了,因此可以完成这个操作。

通过引入Window原语,(离线情况下有一个默认的全局window),我们把GroupByKey这种聚合操作在离线和实时层面也统一了。

数据延时

而在实际业务中,数据的到达时间往往不会严格按照窗口规定的时间按时到达:

  • 数据可能晚来,导致实时计算的数据不准确
  • 窗口可能画的太大,延迟太高

Beam提供了Trigger的机制来解决上述的两个问题。

总结一下, Beam的模型支持了ParDo, GroupByKey, Window等核心概念,通过这些概念的任意组合就可以表达我们在离线、实时业务中遇到各种问题。Beam还提供了Trigger的机制来让我们可以在准确性和时间延迟之间做平衡。

关于Beam表达力的进一步信息可以参见参考资料[3]。

Beam的表达力能涵盖底层引擎(比如ODPS, Spark, Hadoop)的所有功能么?

我就这个问题咨询了一下Beam的开发者: Google的Beam开发者Frances Perry, 他给出的回复是:

Beam的表达能力的集合既不是所有底层引擎能力的交集(那样的话,API的能力太受限了), 也不是所有底层引擎能力的并集(那样的话那也太理想太激进了)。

Beam是要站在所有数据处理的最前端(数据处理人直接面对的那一层),把表达数据逻辑所需要的“模式”(比如Beam里面的Windowing, Trigger)封装出来,包成API。而把具体的一些实现细节功能点隐藏掉(比如Storm里面的Bolt, Spark里面的DataFrame等等)。

因此Beam作为一种数据处理的API, 其实只需要关心模式,而不关心细节的功能点

当然这并不意味着Beam的API从设计的第一天起就可以表达所有的数据计算逻辑,Beam的API也是不断演进的,比如最近就准备加入一个新的叫做Stateful Processing的新特性。但是既然已经那么多公司在使用Beam了(详见本文最后一节),说明目前用它表达绝大部分数据处理的场景已经不是问题了。

关于作者的详细回复可以看参考文献: [2]。

Beam Pipeline的性能

由于目前关于Beam性能方面的资料比较少,我去研究了它的前身FlumeJava性能相关的资料。因此下面的论述的主体都是FlumeJava, 但是因为Beam是从FlumeJava演化而来的,因此这些性能相关的结论对Beam也适用。

理论分析

延迟求值

为了获得更好的性能,FlumeJava内部对并行的操作使用了延迟求值的优化。我们代码中对于并行操作(各种Transform)的调用并没有真正的去执行那个操作,而只是简单的把这些对数据的操作以及对应的参数记录了下来。这些被记录下来的操作串联拼接在一起就组成了一个DAG状的执行计划。

通过生成执行计划,而不是直接运行用户编写的Pipeline, 使得Beam(FlumeJava)有机会可以对这个执行计划进行各种优化 -- 优化之后会比你手动优化之后的任务要更高效!

执行计划的优化

在真正执行之前,Beam会对这个执行进行一些优化, 比如ParDo操作的的合并

通过ParDo的合并,可以减少任务的步数,这样在生成底层引擎任务的时候,比如Hadoop的时候,会生成比较少的MapReduce, 更少的MapReduce意味着更少的IO, 更好的性能。

其它的优化措施还有MSCR(把一个ParDo, GroupByKey, CombineValues, Flattern操作合并成一个MapReduce), MSCR合并等等。

Benchmark

图中Ads Logs, IndexStats, Build Logs, SiteData是Google内部的几个用来做性能测试的几个不同的场景,这几种场景分别用FlumeJava, MapReduce, 以及手工优化过的MapReduce来编写的。可以看出,FlumeJava与经过手工优化过的MapReduce的性能是差不多的。

关于这个性能测试的更详细的信息见参考资料[4]。

Beam在目前业界的使用情况怎么样?

  1. Google: Beam在Google的前身是FlumeJava, FlumeJava是Google内部并行数据计算的主要Java API(参考资料[4])。
  2. Spotify: 他们在生产环境使用Beam, 实时和离线的场景都有,他们目前感觉Beam在离线计算方面比实时要成熟。(参考资料[1])
  3. Cisco: 准备在生产环境中使用Beam,runner会采用Google Dataflow Service,一开始会以实时任务为主。(参考资料[1])
  4. Talend准备把Beam作为他们产品的中间层能力,这样可以让在支持各种底层计算引擎(CDH Hadoop, HDP Hadoop, Spark等等 )的时候公用代码,减少维护各种不同底层引擎升级带来的痛苦(原文是: versions updates are really painful)(参考资料[1])

参考文献

  1. Question and Answers with the Apache Beam Team
  2. Google的Beam开发者Frances Perry关于Beam表达力的回复
  3. Dataflow Model论文
  4. FlumeJava: Easy, Efficient Data-Parallel Pipelines
  5. Stateful processing with Apache Beam
时间: 2024-09-08 13:31:01

Apache Beam研究报告的相关文章

Apache Beam WordCount编程实战及源码解读

概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流处理,提供一套先进的统一的编程模型,并可以运行大数据处理引擎上.完整项目Github源码 负责公司大数据处理相关架构,但是具有多样性,极大的增加了开发成本,急需统一编程处理,Apache Beam,一处编程,处处运行,故将折腾成果分享出来. 1.Apache Beam编程实战–前言,Apache B

Apache Beam 剖析

1.概述 在大数据的浪潮之下,技术的更新迭代十分频繁.受技术开源的影响,大数据开发者提供了十分丰富的工具.但也因为如此,增加了开发者选择合适工具的难度.在大数据处理一些问题的时候,往往使用的技术是多样化的.这完全取决于业务需求,比如进行批处理的MapReduce,实时流处理的Flink,以及SQL交互的Spark SQL等等.而把这些开源框架,工具,类库,平台整合到一起,所需要的工作量以及复杂度,可想而知.这也是大数据开发者比较头疼的问题.而今天要分享的就是整合这些资源的一个解决方案,它就是 A

Apache Beam: 下一代的大数据处理标准

Apache Beam(原名Google DataFlow)是Google在2016年2月份贡献给Apache基金会的Apache孵化项目,被认为是继MapReduce,GFS和BigQuery等之后,Google在大数据处理领域对开源社区的又一个非常大的贡献.Apache Beam的主要目标是统一批处理和流处理的编程范式,为无限,乱序,web-scale的数据集处理提供简单灵活,功能丰富以及表达能力十分强大的SDK.Apache Beam项目重点在于数据处理的编程范式和接口定义,并不涉及具体执

Apache Beam初探

Apache Beam Apache Beam provides an advanced unified programming model, allowing you to implement batch and streaming data processing jobs that can run on any execution engine. Apache Beam is: UNIFIED - Use a single programming model for both batch a

Apache Beam欲通过uber api获取大数据

文章讲的是Apache Beam欲通过uber api获取大数据,现在,有用的Apache大数据项目似乎每日更新.相比于每次都重新学习的方式,如果可以通过一个统一的API如何呢? 长期开玩笑说Hadoop生态系统是那种如果你不喜欢一个为特定系统的API,等待五分钟,两个新的Apache项目将出现随之而来崭新的API可供学习. 有很多要赶着学习.更糟糕的是,它会导致很多工作迁移到不同的项目仅仅为了保持通用性."我们已经在暴风雨中实现了流媒体解决方案!现在我们已经快速地重做了!我们目前正在重写pac

Apache Beam发布第一个稳定版本

Apache Beam在官方博客上正式发布了Beam 2.0.0.这是Beam有史以来的第一个稳定版本,根据Beam社区的声明,Beam意欲为未来版本发布保持API的稳定性,并让Beam适用于企业的部署. Beam的第一个稳定版本是Beam社区发布的第三个重要里程碑.Beam在2016年2月成为Apache孵化器项目,并在同年12月升级成为Apache基金会的顶级项目.经过从开始至今的15个月全神贯注的努力,从一个有点混乱的代码库开始,从各大组织合并代码,成就了如今的这个数据处理框架,它是一个真

大数据统一的批处理和流处理标准 Apache Beam

Apache Beam 是 Apache 软件基金会越来越多的数据流项目中最新增添的成员,是 Google 在2016年2月份贡献给 Apache 基金会的孵化项目. 这个项目的名称表明了设计:结合了批处理(Batch)模式和数据流(Stream)处理模式.它基于一种统一模式,用于定义和执行数据并行处理管道(pipeline),这些管理随带一套针对特定语言的SDK用于构建管道,以及针对特定运行时环境的Runner用于执行管道. Apache Beam 的主要目标是统一批处理和流处理的编程范式,为

阿里技术协会(ATA) 201702系列精选文集

阿里巴巴提倡社区型的"共享+共建"理念,特别鼓励集团技术工程师之间的交流和合作,以此促进技术发展和创新.阿里巴巴技术协会(Alibaba Technology Association,简称ATA)这个阿里巴巴内部技术交流第一平台,便由此理念应运而生.  移动开发 Android Studio 你不知道的调试技巧 Android秒级编译工具Freeline新特性支持! 一个安卓编译器「Bug」引发的血案 Preact--无线端活动页的轻量级开发方案 Java编程 我的java问题排查工具

2016美国QCon看法:在Beam上,我为什么说Google有统一流式计算的野心

编者按:流式计算(Stream Processing)在经历了若干年的发展之后,已经有了比较完整的生态,如开源的Storm, Flink, Spark等,未开源的如Google的DataFlow,几乎每个巨头都有自己的流式计算系统.生态虽繁荣但分散,各个平台之间也是互不兼容的,一个平台上写的程序很难移植到另外一个平台,这些领域难题再加上Google大一统流式计算的野心催生了Apache孵化器的新项目Beam.            Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部