Why

  1. Apache Beam 本身并不是一个数据处理平台,本身也无法对数据进行处理
    • Apache Beam 所提供的是一个统一的编程模型思想
    • 通过 Apache Beam 统一的 API 来编写处理逻辑,该处理逻辑会被转化为底层运行引擎相应的 API 去运行
  2. SDK 会变,但背后的设计原理却不会改变

生态

image-20241119165246495

Layer Desc
Runner 现有的各种大数据处理平台,如 Apache Spark、Apache Flink
可移植统一模型层 各个 Runner 将会依据中间抽象出来的模型思想
Runner提供一套符合该模型APIs 出来,以供上层转换
SDK 提供不同语言版本的 API 来编写数据处理逻辑
这些数据处理逻辑会被转换成 Runner 中相应的 API 来运行

基本概念

  1. 数据可以分成有界数据无界数据
    • 其中有界数据是无界数据的特例,可以将所有的数据抽象看作无界数据
  2. 每个数据都有两个时域,即事件时间处理时间
    • 处理无界数据时,数据会有延迟丢失的情况
    • 因此,无法保证是否接收完了所有发生在某一时刻之前的数据 - 事件时间
    • 流处理必须在数据的完整性数据处理的延时性上做出取舍

Window

  1. 窗口将无界数据根据事件时间分成一个个有限的数据集 - 批处理的特例
  2. 批处理中,可以把一个无限小无穷大的时间窗口赋予给数据集

Watermark

  1. 水位线是用来表示与数据事件时间相关联的输入完整性的概念
  2. 对于事件时间X 的水位线
    • 数据处理逻辑已经得到了所有事件时间小于 X无界数据
  3. 在数据处理中,水位线是用来测量数据进度

Triggers

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

Accumulation

  1. 累加模式指的是如果我们在同一窗口中得到多个运算结果,应该如何处理这些运算结果
  2. 这些结果之间可能完全不相关,但也可能会重叠在一起

编程模型

WWWH

What results are being calculated?

  1. 明确需要做的计算,得到怎样的结果 - Beam SDK 中的各种 transform 操作
  2. 包括常用的批处理逻辑、训练机器学习模型的逻辑等

Where in event time they are being computed?

  1. 计算在什么事件时间范围的数据 - 窗口

When in processing time they are materialized?

  1. 何时将计算结果输出 - 可以通过水位线触发器配合触发计算
  2. 在 Apache Beam 中,可以有多种多样的触发器信号
    • 根据处理时间的信号来触发 - 即每隔一段时间则重新计算一遍窗口中的数据
    • 根据元素计数的信号来触发 - 即在一个窗口中的数据达到一定的数量,则计算该窗口中的数据

How earlier results relate to later refinements?

  1. 后续数据的处理结果如何影响之前的处理结果 - 累加模式
  2. 常见的累加模式 - 丢弃(结果之间是独立且不同的)、累积(后来的结果是建立在先前的结果上)
  3. 每一次通过计算一个窗口中的数据而得到的结果,称之为窗格(Pane)
    • 累加模式中的丢弃,实际丢弃的是窗格

小结

  1. Beam 编程模型是将所有的数据处理逻辑都分割成四个维度,统一成了 Beam SDK
  2. 基于 Beam SDK 构建数据处理业务逻辑时
    • 只需要根据业务需求,按照这四个维度调用具体的 API,即可生成符合要求的数据处理逻辑
    • Beam 会自动转化数据处理逻辑,并提交到具体的 Runner 上去执行
  3. 无论是 Runner 自身的 API 还是 Beam 的 SDK 设计,都需要有能力去解决上述四个问题
  4. Beam 编程模型贯穿 Beam 生态圈中的每一层