Apace Beam 入门


官方文档

Apache Beam 的编程模型

Apache Beam 是一种统一的开源模型,用于定义批量数据和流式数据的并行处理流水线。 借助一种 Apache Beam SDK,您可以构建一个程序来定义流水线。然后,Apache Beam 支持的一种分布式处理后端(如 Dataflow)会执行该流水线。此模型使您可以专注于对数据处理作业进行逻辑组合,而不是对并行处理进行物理编排。您可以专注于您需要作业执行的任务,而不是执行作业的方式。

概念

基本概念

概念名称 说明
流水线 封装了读取输入数据、转换输入数据和写入输出数据所涉及的一系列计算,每条流水线都代表一个可重复的作业。
PCollection PCollection 表示一个潜在分布的多元素数据集(用作流水线的数据),可以是一个固定大小的数据集(批),也可以是持续更新的无界限数据集(流式)。
转换 转换表示用于转换数据的处理操作。Old PCollection - 转换 -> New PCollection
ParDo ParDo 是 Apache Beam SDK 中的核心并行处理操作,对输入 PCollection 中的每个元素调用用户指定的函数。ParDo 将零个或多个输出元素收集到一个输出 PCollection 中。ParDo 转换独立且可能并行地处理元素。
管道 I/O 用于将数据读入流水线,或从流水线中输出。支持多存储格式数据。
聚合 聚合是从多个输入元素计算某个值的过程。Apache Beam 中聚合的主要计算模式是使用公共键和窗口对所有元素进行分组。然后,它使用关联和交换操作组合每组元素。 如果是无界限数据集,则务必先应用 Window 然后再做聚合。
用户定义的函数 (UDF) Apache Beam 中的某些操作允许将执行用户定义的代码作为配置转换的一种方式。
运行程序 运行程序是接受流水线并执行它的软件。大多数运行程序是用于大规模并行大数据处理系统的翻译器或适配器。 其他运行程序用于本地测试和调试。

高级概念

概念名称 说明
事件时间 数据时间发生的时间,,由数据元素本身的时间戳决定。(与之对应的是流水线处理数据元素的时间 & 数据实际到达流水线的时间)
数据选取 数据选取可对无界限集合进行分组操作,方法是根据各个元素的时间戳,将集合划分为有界限集合窗口。数据选取函数告诉运行程序如何将元素分配给初始窗口,以及如何合并分组元素的窗口。 Apache Beam 允许您定义不同类型的窗口或使用预定义的数据选取函数。
水印 Apache Beam 会跟踪水印(这是一个系统概念,指示了某个窗口中的所有数据预计会在何时到达流水线)。Apache Beam 会跟踪水印,因为不能保证数据会按时间顺序或以可预测的时间间隔到达流水线。此外,也不能保证数据事件将以它们的生成顺序出现在流水线中。
触发器 触发器确定在数据到达时发送聚合结果的时间。对于有界限数据,结果会在处理完所有输入后发送。对于无界限数据,结果会在水印超过窗口末尾后发送,表明系统认为该窗口的所有输入数据都已处理完毕。Apache Beam 提供了几个预定义的触发器,可以组合使用它们。

流式处理流水线

无界限 PCollection (或称无界限集合),表示流处理流水线中的数据。无界限集合包含来自不断更新的数据源的数据,例如 Pub/Sub。

可以使用窗口、水印和触发器来汇总无界限集合中的元素。

窗口和窗口函数

窗口函数将无界限集合划分为逻辑组件或窗口。窗口函数按各个元素的时间戳对无界限集合进行分组。每个窗口包含有限数量的元素。

可设置的窗口类型如下所示:

  • 翻滚窗口(固定窗口):翻滚窗口表示数据流中的一段一致且不相交的时间间隔。 例如,如果设置三十秒的翻滚窗口,则时间戳值为 0-30s 的元素位于第一个窗口中。时间戳值为 30-60s 的元素位于第二个窗口中。
  • 跳跃窗口(滑动窗口):跳跃窗口表示数据流中的一段一致时间间隔。跳跃窗口可以重叠,而翻滚窗户是不相交的。 例如,跳跃窗口可以每 10 秒钟启动一次,并捕获 1 分钟的数据和窗口。跳跃窗口的启动频率被称为周期。此示例中窗口的时长为一分钟,周期为三十秒。 如下图所示:
  • 会话窗口:会话窗口包含另一元素的间隔时长内的元素。间隔时长是数据流中新数据之间的间隔。如果数据在间隔时长之后到达,则数据将被分配给新窗口。 例如,会话窗口可以划分表示用户鼠标活动的数据流。此数据流可能包含较长的空闲时间,中间散布着许多点击。会话窗口可以包含由点击产生的数据。 会话数据选取会为每个数据键分配不同的窗口。翻滚窗口和跳跃窗口包含指定时间间隔内的所有元素,与数据键无关。 如下图所示:
  • 全局窗口:如果 PCollection 是有界的(非流式数据,因为这是无界数据),大小固定,这样才可以将元素分配到一个单个的全局窗口中,否则不可以。

水印

水印是一个阈值,它表明了 Dataflow 预计一个窗口中的所有数据何时到达。如果到达的新数据的时间戳在窗口中但早于水印,则该数据被视为迟到数据。

Dataflow 出于以下原因跟踪水印:

无法保证数据会按时间顺序或以可预测的时间间隔到达。 无法保证数据事件会按照它们生成的顺序出现在流水线中。 数据源会确定水印。您可以通过 Apache Beam SDK 来允许出现迟到数据。Dataflow SQL 不会处理迟到数据。

apache-beam: watermarks-and-late-data

简单来说,水印主要针对的问题为:数据发生的实际时间,与实际数据被处理的时间存储一定的程度延迟,也不能保证数据事件将按照生成事件的顺序出现在管道中。 水印,表示一个预计所有数据的到达时间。

举例来说: 我们设置水印为 30s,一个固定窗口 5min,那么 beam 会在 5:30 时关闭第一个窗口,(5min+30s) 如果数据在 5:34 到达,但是发生时间为 3:38,那么这个数据为迟到数据,则不采用了。 同样如果数据在 5:20 到达,发生时间为 3:38,则该数据计入第一个窗口,而如果数据在 5:20 到,发生时间为 5:18,则计入第二个窗口。

触发器

触发器确定在数据到达时发送聚合结果的时间。默认情况下,结果会在水印超过窗口末尾后发出。