Beam - Paradigm
Why
- Apache Beam 本身并不是一个数据处理平台,本身也无法对数据进行处理
- Apache Beam 所提供的是一个统一的编程模型思想
- 通过 Apache Beam 统一的 API 来编写处理逻辑,该处理逻辑会被转化为底层运行引擎相应的 API 去运行
- SDK 会变,但背后的设计原理却不会改变
生态
Layer | Desc |
---|---|
Runner | 现有的各种大数据处理平台,如 Apache Spark、Apache Flink |
可移植的统一模型层 | 各个 Runner 将会依据中间抽象出来的模型思想 Runner 将提供一套符合该模型的 APIs 出来,以供上层转换 |
SDK | 提供不同语言版本的 API 来编写数据处理逻辑 这些数据处理逻辑会被转换成 Runner 中相应的 API 来运行 |
基本概念
- 数据可以分成有界数据和无界数据
- 其中有界数据是无界数据的特例,可以将所有的数据抽象看作无界数据
- 每个数据都有两个时域,即事件时间和处理时间
- 处理无界数据时,数据会有延迟、丢失的情况
- 因此,无法保证是否接收完了所有发生在某一时刻之前的数据 - 事件时间
- 流处理必须在数据的完整性和数据处理的延时性上做出取舍
Window
- 窗口将无界数据根据事件时间分成一个个有限的数据集 - 批处理的特例
- 在批处理中,可以把一个无限小到无穷大的时间窗口赋予给数据集
Watermark
- 水位线是用来表示与数据事件时间相关联的输入完整性的概念
- 对于事件时间为 X 的水位线
- 数据处理逻辑已经得到了所有事件时间小于 X 的无界数据
- 在数据处理中,水位线是用来测量数据进度的
Triggers
- 触发器指的是表示具体在什么时候,数据处理逻辑会真正地触发窗口中的数据被计算
- 触发器能让我们可以在有需要时对数据进行多次运算
- 如某时间窗口内的数据有更新,这一窗口内的数据结果需要重新计算
Accumulation
- 累加模式指的是如果我们在同一窗口中得到多个运算结果,应该如何处理这些运算结果
- 这些结果之间可能完全不相关,但也可能会重叠在一起
编程模型
WWWH
What results are being calculated?
- 明确需要做的计算,得到怎样的结果 - Beam SDK 中的各种 transform 操作
- 包括常用的批处理逻辑、训练机器学习模型的逻辑等
Where in event time they are being computed?
- 计算在什么事件时间范围的数据 - 窗口
When in processing time they are materialized?
- 何时将计算结果输出 - 可以通过水位线和触发器配合触发计算
- 在 Apache Beam 中,可以有多种多样的触发器信号
- 根据处理时间的信号来触发 - 即每隔一段时间则重新计算一遍窗口中的数据
- 根据元素计数的信号来触发 - 即在一个窗口中的数据达到一定的数量,则计算该窗口中的数据
How earlier results relate to later refinements?
- 后续数据的处理结果如何影响之前的处理结果 - 累加模式
- 常见的累加模式 - 丢弃(结果之间是独立且不同的)、累积(后来的结果是建立在先前的结果上)
- 每一次通过计算一个窗口中的数据而得到的结果,称之为窗格(Pane)
- 累加模式中的丢弃,实际丢弃的是窗格
小结
- Beam 编程模型是将所有的数据处理逻辑都分割成四个维度,统一成了 Beam SDK
- 基于 Beam SDK 构建数据处理业务逻辑时
- 只需要根据业务需求,按照这四个维度调用具体的 API,即可生成符合要求的数据处理逻辑
- Beam 会自动转化数据处理逻辑,并提交到具体的 Runner 上去执行
- 无论是 Runner 自身的 API 还是 Beam 的 SDK 设计,都需要有能力去解决上述四个问题
- Beam 编程模型贯穿 Beam 生态圈中的每一层
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.