Beam - Pipeline
创建
- 在 Beam 中,所有的数据处理逻辑都会被抽象成 Pipeline 来运行
- Pipeline 是对数据处理逻辑的一个封装
- 包括一整套流程 - 读取数据集、将数据集转换成想要的结果、输出结果数据集
创建 Pipeline
1 | PipelineOptions options = PipelineOptionsFactory.create(); |
应用
- PCollection 具有不可变性
- 一个 PCollection 一旦生成,就不能在增加或者删除里面的元素了
- 在 Beam 中,每次 PCollection 经过一个 Transform 之后,Pipeline 都会创建一个新的 PCollection
- 新创建的 PCollection 又成为下一个 Transform 的输入
- 原先的 PCollection 不会有任何改变
- 对同一个 PCollection 可以应用多种不同的 Transform
处理模型
- Pipeline 的底层思想依然是 MapReduce
- 在分布式环境下,整个 Pipeline 会启动 N 个 Workers 来同时处理 PCollection
- 在具体处理某个特定 Transform 时
- Pipeline 会将这个 Transform 的输入数据集 PCollection 中的元素分割成不同的 Bundle
- 并将这些 Bundle 分发到不同的 Worker 来处理
- Pipeline 具体会分配多少个 Worker,以及将一个 PCollection 分割成多少个 Bundle 都是随机的
- Pipeline 会尽可能地让整个处理流程达到完美并行 - Embarrassingly Parallel
- 在多步骤的 Transforms 中,一个 Bundle 通过一个 Transform 产生出来的结果作为下一个 Transform 的输入
- 每一个 Bundle 在一个 Worker 上经过 Transform 逻辑后,也会产生一个新的不可变的 Bundle
- 具有关联性的 Bundle,必须在同一个 Worker 上处理
第一个 Transform 将元素的数值减 1;第二个 Transform 对元素的数值求平方
总共产生 6 个不可变的 Bundle,Bundle1~Bundle3 的整个过程都必须放在 Worker1 上完成,因为具有关联性
错误处理
单个 Transform 上的错误处理
- 如果某一个 Bundle 里面的元素因为任意原因导致处理失败,则整个 Bundle 里面的元素都必须重新处理
- 重新处理的 Bundle 不一定要在原来的 Worker 上执行,可能会转移到其它 Worker
多步骤 Transform 上的错误处理
- 如果处理的一个 Bundle 元素发生了错误
- 则这个元素所在的整个 Bundle 以及与这个 Bundle 有关联的所有 Bundle 都必须重新处理
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.