数据抽象

Spark RDD

  1. 不同的技术系统有不同的数据结构, 如在 C++ 中有 vector、unordered_map
  2. 几乎所有的 Beam 数据都能表达为 PCollection
  3. PCollection - Parallel Collection - 可并行计算的数据集,与 Spark RDD 非常类似
  4. 在一个分布式计算系统中,需要为用户隐藏实现细节,包括数据是怎样表达存储
    • 数据可能来自于内存的数据,也可能来自于外部文件,或者来自于 MySQL 数据库
    • 如果没有一个统一的数据抽象的话,开发者需要不停地修改代码,无法专注于业务逻辑

Coder

数据类型进行序列化反序列化,便于在网络传输

  1. 需要为 PCollection 的元素编写 Coder
  2. Coder 的作用与 Beam 的本质紧密相关
    • 计算流程最终会运行在一个分布式系统
    • 所有的数据都可能在网络上的计算机之间相互传递
    • Coder 就是告诉 Beam 如何将数据类型进行序列化反序列化,以便于在网络上传输
  3. Coder 需要注册进全局CoderRegistry
    • 为自定义的数据类型建立与 Coder 的对应关系,无需每次都手动指定

无序

  1. PCollection 的无序特性与分布式本质有关
  2. 一旦一个 PCollection 被分配到不同的机器上执行
    • 为了保证最大的吞吐量,不同机器都是独立运行
    • 因此执行顺序无从得知

无固定大小

  1. Beam 要统一批处理流处理,所以要统一表达有界数据无界数据,因此 PCollection没有限制容量
  2. 一个 PCollection 可以是有界的,也可以是无界
    • 一个无界的 PCollection 表达了一个无限大小的数据集
  3. 一个 PCollection 是否有界,往往取决于它是如何产生
    • 批处理的数据源(一个文件、一个数据库)中读取,就会产生有界的 PCollection
    • 流式或者持续更新的数据库中读取,如 pub/sub 或者 Kafka,会产生一个无界的 PCollection
  4. PCollection 的有界无界特性会影响到 Beam 的数据处理方式
    • 一个批处理作业往往处理有界的 PCollection,而无界的 PCollection 需要流式作业来连续处理
  5. Beam 也是用 Window 来分割持续更新无界数据,一个流数据可以被持续地拆分成不同的小块

不可变性

  1. PCollection 不提供任何修改它所承载数据的方式
  2. 修改一个 PCollection 的唯一方式去 Transform
  3. Beam 的 PCollection 都是延迟执行的 - deferred execution
1
2
PCollection<T1> p1 = ...;
PCollection<T2> p2 = doSomeWork(p1);
  1. p2 这个 PCollection 仅仅会记录下自己是由 doSomeWork 这个操作计算而来的,和计算自己所需要的数据 p1
  2. 运算操作的最终结果,仅仅只是生成一个 DAG,即执行计划 - execution plan
    • DAG框架能够自动优化执行计划的核心
  3. PCollection 下的数据不可变性是因为改变本身毫无意义
    • 由于 Beam 的分布式本质,想要去修改一个 PCollection 的底层表达数据,需要在多个机器上查找