Beam - PCollection
数据抽象
Spark RDD
- 不同的技术系统有不同的数据结构, 如在 C++ 中有 vector、unordered_map
- 几乎所有的 Beam 数据都能表达为 PCollection
- PCollection - Parallel Collection - 可并行计算的数据集,与 Spark RDD 非常类似
- 在一个分布式计算系统中,需要为用户隐藏实现细节,包括数据是怎样表达和存储的
- 数据可能来自于内存的数据,也可能来自于外部文件,或者来自于 MySQL 数据库
- 如果没有一个统一的数据抽象的话,开发者需要不停地修改代码,无法专注于业务逻辑
Coder
将数据类型进行序列化和反序列化,便于在网络上传输
- 需要为 PCollection 的元素编写 Coder
- Coder 的作用与 Beam 的本质紧密相关
- 计算流程最终会运行在一个分布式系统
- 所有的数据都可能在网络上的计算机之间相互传递
- Coder 就是告诉 Beam 如何将数据类型进行序列化和反序列化,以便于在网络上传输
- Coder 需要注册进全局的 CoderRegistry
- 为自定义的数据类型建立与 Coder 的对应关系,无需每次都手动指定
无序
- PCollection 的无序特性与分布式本质有关
- 一旦一个 PCollection 被分配到不同的机器上执行
- 为了保证最大的吞吐量,不同机器都是独立运行的
- 因此执行顺序无从得知
无固定大小
- Beam 要统一批处理和流处理,所以要统一表达有界数据和无界数据,因此 PCollection 并没有限制容量
- 一个 PCollection 可以是有界的,也可以是无界的
- 一个无界的 PCollection 表达了一个无限大小的数据集
- 一个 PCollection 是否有界,往往取决于它是如何产生的
- 从批处理的数据源(一个文件、一个数据库)中读取,就会产生有界的 PCollection
- 从流式或者持续更新的数据库中读取,如 pub/sub 或者 Kafka,会产生一个无界的 PCollection
- PCollection 的有界和无界特性会影响到 Beam 的数据处理方式
- 一个批处理作业往往处理有界的 PCollection,而无界的 PCollection 需要流式作业来连续处理
- Beam 也是用 Window 来分割持续更新的无界数据,一个流数据可以被持续地拆分成不同的小块
不可变性
- PCollection 不提供任何修改它所承载数据的方式
- 修改一个 PCollection 的唯一方式去 Transform
- Beam 的 PCollection 都是延迟执行的 - deferred execution
1 | PCollection<T1> p1 = ...; |
- p2 这个 PCollection 仅仅会记录下自己是由 doSomeWork 这个操作计算而来的,和计算自己所需要的数据 p1
- 运算操作的最终结果,仅仅只是生成一个 DAG,即执行计划 - execution plan
- DAG 是框架能够自动优化执行计划的核心
- PCollection 下的数据不可变性是因为改变本身毫无意义
- 由于 Beam 的分布式本质,想要去修改一个 PCollection 的底层表达数据,需要在多个机器上查找
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.