apache beam的使用背景

大数据项目一定会涉及数据处理和计算, 就会涉及到选用哪种计算工具, 摆在面前的有spark、flink、mapreduce、Google Cloud Dataflow等等诸多选择, 如果以同一种计算逻辑去切换计算引擎,就要重新修改里面的API,并调整使用细节,非常不方便。

因此就出现了1个整合这些计算资源的解决方案:apache beam

Beam是1个统一的编程框架,支持批处理和流处理, 并可以将用beam写出来的程序,在多个计算引擎上去运行。

以下是bema当前可支持的计算引擎

初始apache beam_数据集

beam构成

以下图为例,我们可以到,开发者只要用beam框架开发最上层的计算逻辑, 而后面使用何种计算引擎,则不需要关心,beam会自动将我们的计算逻辑转成spark或者flink的代码去运行。

初始apache beam_流处理_02

beam编程模型

1个beam程序,主要涉及以下4个概念:
Beam的编程模型是Google的工程师从MapReduce, FlumeJava, 和Millwheel等多个大数据处理项目中抽象出来的,如果想详细了解可以参考相关的报考和论文,Streaming 101,Streaming 102 和VLDB 2015 paper.。这个编程模型主要包括如下几个核心概念:

  • PCollection:数据集,代表了将要被处理的数据集合,可以是有限的数据集,也可以是无限的数据流。
  • PTransform:计算过程,代表了将输入数据集处理成输出数据集中间的计算过程,
  • Pipeline:管道,代表了处理数据的执行任务,可视作一个有向无环图(DAG),PCollections是节点,Transforms是边。
  • PipelineRunner:执行器,指定了Pipeline将要在哪里,怎样的运行。

Beam的编程模型可简单概括为

[Output PCollection] = [Input PCollection].apply([Transform])

beam的优势

  • 屏蔽了底层开发引擎的区别,以至于开发者能专心于计算逻辑开发,并能很方便地进行计算引擎的切换,在架构上做调整就会很方便。
  • 统一了数据批处理(batch)和流处理(stream)编程范式, 批处理和流处理仅仅只是apply组装计算过程时,增加流处理的窗口和触发器设置即可。

beam的缺陷

  • 性能上相较于直接用计算引擎框架编码会有降低,beam里会将任何希望计算的数据类型都转成二进制流进行传递,在编码解码上会消耗性能。