Beam 是一种编程模型。旨在统一 Batch 和 Streaming 两种编程接口.

第一层,是现在已有的各种大数据处理平台(例如 Apache Spark 或者 Apache Flink),在 Beam 中它们也被称为 Runner。

第二层,是可移植的统一模型层,各个 Runners 将会依据中间抽象出来的这个模型思想,提供一套符合这个模型的 APIs 出来,以供上层转换。

第三层,是 SDK 层。SDK 层将会给工程师提供不同语言版本的 API 来编写数据处理逻辑,这些逻辑就会被转化成 Runner 中相应的 API 来运行。

第四层,是可扩展库层。工程师可以根据已有的 Beam SDK,贡献分享出更多的新开发者 SDK、IO 连接器、转换操作库等等。

第五层,我们可以看作是应用层,各种应用将会通过下层的 Beam SDK 或工程师贡献的开发者 SDK 来实现。

最上面的第六层,也就是社区一层。在这里,全世界的工程师可以提出问题,解决问题,实现解决问题的思路。

Beam 涉及的4个概念

数据分为有边界数据和无边界数据, 其中有边界数据又可以看成是特殊的无边界数据。

同样,每一个数据都是有两种时域的,分别是事件时间和处理时间。我们在处理无边界数据的时候,因为在现实世界中,数据会有延时、丢失等等的状况发生,我们无法保证现在到底是否接收完了所有发生在某一时刻之前的数据。所以现实中,流处理必须在数据的完整性和数据处理的延时性上作出取舍。

窗口 ( Window )

窗口将无边界数据根据 事件时间 分成了一个个有限的数据集. 每次通过计算一个窗口中的数据而得到的结果,称之为 窗格 ( Pane )

水印 ( Watermark )

水印是用来表示与数据事件时间相关联的输入完整性的概念。对于事件时间为 X 的水印是指:数据处理逻辑已经得到了所有事件时间小于 X 的无边界数据。在数据处理中,水印是用来测量数据进度的。

触发器(Triggers)

触发器指的是表示在具体什么时候,数据处理逻辑会真正地触发窗口中的数据被计算。触发器能让我们可以在有需要时对数据进行多次运算,例如某时间窗口内的数据有更新,这一窗口内的数据结果需要重算。

累加模式(Accumulation)