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 Fusion

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

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

Benchmark

FlumeJava 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容