初探Apache Beam
文章作者:luxianghao
文章来源:http://www.cnblogs.com/luxianghao/p/9010748.html 转载请注明,谢谢合作。
免责声明:文章内容仅代表个人观点,如有不当,欢迎指正。
---
一 引言
2016年2月Google宣布将Beam(原名Google DataFlow)贡献给Apache基金会孵化,成为Apache的一个顶级开源项目。
Beam是一个统一的编程框架,支持批处理和流处理,并可以将用Beam编程模型构造出来的程序,在多个计算引擎(Apache Apex, Apache Flink, Apache Spark, Google Cloud Dataflow等)上运行。
大数据起源于Google 2003年发布的三篇论文GoogleFS、MapReduce、BigTable,史称三驾马车,可惜Google在发布论文后并没有公布其源码,但是Apache开源社区蓬勃发展,先后出现了Hadoop,Spark,Apache Flink等产品,而Google内部则使用着闭源的BigTable、Spanner、Millwheel,但他们殊途同归,这次Google没有发一篇论文后便销声匿迹,而是高调的开源了Beam,所谓“一流公司定标准”,开源的好处也是相当的多,如提高公司影响力,集思广益,共同维护等。
二 Beam优势
1 统一
Beam提供统一的编程模型,编程指导可以参考官方的programming-guide,通过quickstart-java和wordcount-example入门。
2 可移植
编程人员coding的时候基本不需要关注将来代码会运行到Spark、Flink或者其他计算平台上,coding完成后再通过命令行选择计算平台。
3 可扩展
如在2 可移植中所写,已经展示了DirectRunner和SparkRunner,在Beam中,Runner,IO链接器,转换操作库,甚至SDK都是可以自己定制的,具有高度的扩展性。
4 支持批处理和流处理
不管将来编程人员用Beam写的程序是用于批处理还是流处理,用于有限的数据集还是无限的数据集,用Beam写的程序都可以不修改的执行。(Beam通过引入triggering,windows的概念来解决这个问题)
5 高度抽象
Beam用DAG(directed acyclic graph)进行了高度的抽象,编程人员不需要将其代码强制构造成Map-Shuffle-Reduce的形式,可以直接进行更高级别的操作,如counting, joining, projecting。
6 多语言支持
目前官方支持了Java和Python,后面会有更多语言的SDK开发出来
三 Beam构成
先来一个整体框架图
1 Beam编程模型
Beam的编程模型是Google的工程师从MapReduce, FlumeJava, 和Millwheel等多个大数据处理项目中抽象出来的,如果想详细了解可以参考相关的报考和论文,Streaming 101,Streaming 102 和VLDB 2015 paper.。这个编程模型主要包括如下几个核心概念:
- PCollection:数据集,代表了将要被处理的数据集合,可以是有限的数据集,也可以是无限的数据流。
- PTransform:计算过程,代表了将输入数据集处理成输出数据集中间的计算过程,
- Pipeline:管道,代表了处理数据的执行任务,可视作一个有向无环图(DAG),PCollections是节点,Transforms是边。
- PipelineRunner:执行器,指定了Pipeline将要在哪里,怎样的运行。
其中PTransform还包括很多操作,如:
- ParDo:通用的并行处理的PTranform, 相当于Map/Shuffle/Reduce-style 中的Map,可用于过滤 、类型转换 、抽取部分数据 、 对数据中的每一个元素做计算等
- GroupByKey:用来聚合key/value对,相当于Map/Shuffle/Reduce-style中的Shuffle, 聚合那些拥有同一个key的value
- CoGroupByKey:用来聚合多个集合,功能和GroupByKey类似
- Combine:处理集合里的数据,如sum, min, and max(sdk预定义),也可以自建新类
- Flatten:用来把多个数据集合并成一个数据集
- Partition:用来把一个数据集分割成多个小数据集
此外还有一些核心概念,如:
- Windowing:把PCollections数据集中元素通过时间戳分成多个子集
- Watermark:标记了多久时间后的延迟数据直接抛弃
- Triggers:用来决定什么时候发送每个window的聚合结果
Beam的编程模型可简单概括为
[Output PCollection] = [Input PCollection].apply([Transform])
Google工程师还把做Beam编程时的场景抽象成四个问题,就是WWWH
-
即做什么计算,对应的抽象概念为PTransform
-
即在哪个时间范围内计算,对应的抽象概念为Window
-
即在何时输出计算结果,对应的抽象概念为Watermarks和Triggers
-
即怎么提取相关的数据,对应的抽象概念为Accumulation
备注:此处的翻译是参考Streaming 102得来的,可能单纯按照字面翻译并不能达到预期的效果,如有不合适的地方欢迎指正。
2 SDK
Beam支持用多种语言的SDK来构造Pipeline,当前已经支持Java和Python,相对而言,对Java的SDK支持会更好一些。
3 Runner
Beam支持将Pipeline运行在多个分布式后端,目前支持如下的PipelineRunners:
- DirectRunner: 在本地执行Pipeline
- ApexRunner:在Yarn集群(或者用embeded模式)上运行Pipeline
- DataflowRunner:在Google Cloud Dataflow上运行Pipleine
- FlinkRunner:在Flink集群上运行Pipeline
- SparkRunner:在Spark集群上运行Pipeline
- MRRunner:目前在Beam的github主分支上还没提供,不过有mr-runner分支,具体还可参考BEAM-165
四 例子
通过官方的wordcount的例子来实际体验下Beam,详细可参考quickstart-java和wordcount-example。
1 获取相关代码
mvn archetype:generate \
-DarchetypeGroupId=org.apache.beam \
-DarchetypeArtifactId=beam-sdks-java-maven-archetypes-examples \
-DarchetypeVersion=2.1. \
-DgroupId=org.example \
-DartifactId=word-count-beam \
-Dversion="0.1" \
-Dpackage=org.apache.beam.examples \
-DinteractiveMode=false
2 相关文件
$ cd word-count-beam/ $ ls
pom.xml src $ ls src/main/java/org/apache/beam/examples/
DebuggingWordCount.java WindowedWordCount.java common
MinimalWordCount.java WordCount.java
3 使用DrectRunner执行
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount -Dexec.args="--inputFile=pom.xml --output=counts" -Pdirect-runner -Xdebug
4 提交到Spark
方式1
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount -Dexec.args="--runner=SparkRunner --inputFile=pom.xml --output=counts" -Pspark-runner
方式2
spark-submit --class org.apache.beam.examples.WordCount --master local target/word-count-beam-bundled-0.1.jar --runner=SparkRunner --inputFile=pom.xml --output=counts
方式3
spark-submit --class org.apache.beam.examples.WordCount --master yarn --deploy-mode cluster word-count-beam-bundled-0.1.jar --runner=SparkRunner --inputFile=/home/yarn/software/java/LICENSE --output=/tmp/counts
SparkRunner详情参考这里,其中方式3读取HDFS文件的时候会有些问题,这个问题我们在这里会讲到,上面的例子里可以写物理机上实际存在的文件,这样可以保证相关程序正常运行。
五 参考资料
编程指南 https://beam.apache.org/documentation/programming-guide
例子 https://beam.apache.org/get-started/wordcount-example/
Javadoc https://beam.apache.org/documentation/sdks/javadoc/2.1.0/
streaming-101 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101
streaming-102 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
初探Apache Beam的更多相关文章
- Why Apache Beam? A data Artisans perspective
https://cloud.google.com/dataflow/blog/dataflow-beam-and-spark-comparison https://github.com/apache/ ...
- Apache Beam 剖析
1.概述 在大数据的浪潮之下,技术的更新迭代十分频繁.受技术开源的影响,大数据开发者提供了十分丰富的工具.但也因为如此,增加了开发者选择合适工具的难度.在大数据处理一些问题的时候,往往使用的技术是多样 ...
- Apache Beam—透视Google统一流式计算的野心
Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...
- beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...
- Apache Beam WordCount编程实战及源码解读
概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...
- Apache Beam实战指南 | 手把手教你玩转KafkaIO与Flink
https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247492538&idx=2&sn=9a2bd9fe2d7fd6 ...
- Apache beam中的便携式有状态大数据处理
Apache beam中的便携式有状态大数据处理 目标: 什么是 apache beam? 状态 计时器 例子&小demo 一.什么是 apache beam? 上面两个图片一个是正面切图,一 ...
- Apache Beam编程指南
术语 Apache Beam:谷歌开源的统一批处理和流处理的编程模型和SDK. Beam: Apache Beam开源工程的简写 Beam SDK: Beam开发工具包 **Beam Java SDK ...
- Apache Beam是什么?
Apache Beam 的前世今生 1月10日,Apache软件基金会宣布,Apache Beam成功孵化,成为该基金会的一个新的顶级项目,基于Apache V2许可证开源. 2003年,谷歌发布了著 ...
随机推荐
- python类:类方法和静态方法
http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语.逻辑上讲:类方法是只能由类名调 ...
- 通用数据水平层级选择控件v0.70升级版使其支持jQuery v1.9.1
升级原因:作者原来脚本支持的jquery版本太低了,查找了下资料,使得它能支持最新版本的jquery 备注说明:脚本代码源作者跟源文出处很难找,只能在此特感谢他的分享. 更新部分: 1.新版本不再支持 ...
- java的制作"时间账本"
一直以来我都感觉自己的时间过得好荒废啊,貌似只是打开了一个网页链接的时间,一个下午便过去了:仿佛就是看了看空间,刷了刷微信,一天就过去了.哈,当然这是夸张的说法.但是我仔细地算了一下,大概我们每个人每 ...
- 敏捷测试(1)--TDD概念
题记 本系列笔记将从测试人员的角度,总结在百度两年来的测试经验,记录一个完整的基于敏捷流程的验收测试全过程,分享在测试过程中的一些知识和经验,以及自己的一些理念.总结自己,也希望对大家有益. 概念 验 ...
- Android Widget 开发详解(二) +支持listView滑动的widget
转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...
- SpriteBuilder中不能编辑自定义类或不能给节点添加属性的解决
不能编辑自定义类 你选中一个Sub File(CCBFile)节点,在这个例子中,该节点的Custom class区域灰化禁用且不能修改.这是因为你需要在该Sub File引用的CCB文件中修改Cus ...
- android ListView加载不同布局
今天来跟大家讨论下同一个ListView如何加载不同的布局. 老规矩,先来看效果图. 主要步骤如下 1.增加Type. 2.重写getViewTypeCount方法. 3.重写getItemViewT ...
- android微信登录,分享
这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...
- Jenkins hash
最早,Bob Jenkins提出了多个基于字符串通用Hash算法(搜Jenkins Hash就知道了),而Thomas Wang在Jenkins的基础上,针对固定整数输入做了相应的Hash算法.其64 ...
- java中List对象的操作方法
List<String> list = new ArrayList<String>(); //增加 list.add("苹果"); list.add(&qu ...