创建

  1. 在 Beam 中,所有的数据处理逻辑都会被抽象成 Pipeline 来运行
  2. Pipeline 是对数据处理逻辑的一个封装
    • 包括一整套流程 - 读取数据集、将数据集转换成想要的结果、输出结果数据集

创建 Pipeline

1
2
PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);

应用

image-20241120172621481

  1. PCollection 具有不可变性
    • 一个 PCollection 一旦生成,就不能在增加或者删除里面的元素了
  2. 在 Beam 中,每次 PCollection 经过一个 Transform 之后,Pipeline 都会创建一个新的 PCollection
    • 新创建的 PCollection 又成为下一个 Transform 的输入
    • 原先的 PCollection 不会有任何改变
  3. 同一个 PCollection 可以应用多种不同的 Transform

eeb81605c09e4a6cc684176ef0a9c9ef

处理模型

  1. Pipeline底层思想依然是 MapReduce
  2. 分布式环境下,整个 Pipeline 会启动 N 个 Workers同时处理 PCollection
  3. 在具体处理某个特定 Transform
    • Pipeline 会将这个 Transform 的输入数据集 PCollection 中的元素分割成不同的 Bundle
    • 并将这些 Bundle 分发到不同的 Worker 来处理
  4. Pipeline 具体会分配多少个 Worker,以及将一个 PCollection 分割成多少个 Bundle 都是随机
    • Pipeline 会尽可能地让整个处理流程达到完美并行 - Embarrassingly Parallel
  5. 多步骤的 Transforms 中,一个 Bundle 通过一个 Transform 产生出来的结果作为下一个 Transform 的输入
  6. 每一个 Bundle 在一个 Worker 上经过 Transform 逻辑后,也会产生一个新的不可变的 Bundle
  7. 具有关联性Bundle,必须在同一个 Worker 上处理

第一个 Transform 将元素的数值减 1;第二个 Transform 对元素的数值求平方
总共产生 6 个不可变的 Bundle,Bundle1~Bundle3 的整个过程都必须放在 Worker1 上完成,因为具有关联性

574e866c6609c6551083d55ff534cffd

错误处理

单个 Transform 上的错误处理

  1. 如果某一个 Bundle 里面的元素因为任意原因导致处理失败,则整个 Bundle 里面的元素都必须重新处理
  2. 重新处理的 Bundle 不一定要在原来的 Worker 上执行,可能会转移到其它 Worker

多步骤 Transform 上的错误处理

  1. 如果处理的一个 Bundle 元素发生了错误
  2. 这个元素所在的整个 Bundle 以及与这个 Bundle 有关联的所有 Bundle 都必须重新处理

939e3cf386d5ae416dd878743d98be25