Apache Beam是Google开源的,旨在统一批处理和流处理的编程范式,核心思想是将批处理和流处理都抽象成Pipeline、Pcollection、PTransform三个概念。Apache Beam本身是不具备计算功能的,数据的交换和计算都是由底层的工作流引擎(Apache Apex, Apache Flink, Apache Spark, and Google Cloud Dataflow)完成,由各个计算引擎提供Runner供Apache Beam调用,而Apache Beam提供了Java、Python、Go语言三个SDK供开发者使用。
批处理最经典的编程模型莫过于MapReduce,通过提供统一的抽象接口(文件),不可变的编程模型实现对数据的切分计算,而流处理的编程模型则是事件流的概念,把每一次流过窗口的数据作为一次事件处理。批处理和流处理的数据最关键的区别在于批处理的数据集合是有界的,文件或者数据具有固定的大小,不会发生改变,而流处理的数据集合是无界的,理论上来说,事件是无穷无尽的。现在分布式系统里,批处理和流处理的统一最知名的莫过于lambda架构。
Apache Beam的编程模型的核心概念只有三个:
在使用Apache Beam时,需要创建一个Pipeline,然后设置初始的PCollection从外部存储系统读取数据,或者从内存中产生数据,并且在PCollection上应用PTransform处理数据(例如修改,过滤或聚合等),一个PTransform过程会重新生成一个PCollection,而不是原地修改(类似与Spark的RDD)。
具体编程细节可以参考:Apache Beam Programming Guide
有一些点值得注意:
[Output PCollection 1] = [Input PCollection] | [Transform 1]
关于PCollection中的元素,Apache Beam会决定如何进行序列化、通信以及持久化,对于Beam的runner而言,Beam整个框架会负责将元素序列化成下层计算引擎对应的数据结构,交换给计算引擎,再由计算引擎对元素进行处理。而正因为PCollection的不可变性以及元素统一的类型,可以对PCollection进行优化和拆分交给不同的机器进行计算,这也意味着每一个PTransform都是可以允许失败,进行重新计算。
在官方文档中给出了几个建议:
有下面几种类型的Pipeline: