博客
2020/12/14
Apache Beam 的可拆分 DoFn 现已可用
张博远
我们很高兴地宣布,可拆分 DoFn (SDF) 现已在 Beam Python、Java 和 Go SDK 的 2.25.0 及更高版本中可用。
2017 年,可拆分 DoFn 博客文章 提议构建 可拆分 DoFn API 作为构建 I/O 连接器的推荐方式。可拆分 DoFn 是 DoFn 的泛化,它赋予了 DoFn Source
的核心功能,同时保留了 DoFn 的语法、灵活性、模块化和易于编码的特性。因此,开发复杂 I/O 连接器变得更加容易,代码更加简单且可重用。
与现有的 UnboundedSource
和 BoundedSource
相比,SDF 有三个优势
- SDF 提供了一套统一的 API 来处理无界和有界情况。
- SDF 支持从源描述符动态读取。
- 以 KafkaIO 为例,在
UnboundedSource
/BoundedSource
API 中,您必须在管道构建时指定要从中读取的主题和分区。UnboundedSource
/BoundedSource
无法在执行时接受主题和分区作为输入。但 SDF 具有此功能。
- 以 KafkaIO 为例,在
- SDF 能够自由拆分,可以作为管道中的任何节点。
UnboundedSource
/BoundedSource
必须是管道的根节点才能从拆分策略中获得性能优势,这限制了许多实际应用。这对 SDF 来说不再是限制。
由于 SDF 现在已经可以与所有提到的改进一起使用,因此它成为构建新的 I/O 连接器的推荐方式。请遵循 编程指南 尝试构建自己的可拆分 DoFn。我们在 Beam SDK 中提供了大量的通用实用类,例如 RestrictionTracker
和 WatermarkEstimator
的常见类型,可以帮助您轻松上手。对于现有的 I/O 连接器,我们已经将 UnboundedSource
和 BoundedSource
实现包装到了可拆分 DoFn 中,但我们仍然鼓励开发人员将 UnboundedSource
/BoundedSource
转换为实际的可拆分 DoFn 实现,以获得更高的性能优势。
非常感谢每位将这项备受期待的设计带入数据处理领域的贡献者。我们非常期待看到用户从 SDF 中获益。
以下是一些供您探索的实际 SDF 示例。
实际可拆分 DoFn 示例
Java 示例
- Kafka: 用于 Apache Kafka (一个开源的分布式事件流平台)的 I/O 连接器。
- Watch: 使用轮询函数为每个输入生成不断增长的输出集,直到满足每个输入的终止条件。
- Parquet: 用于 Apache Parquet (一个开源的列式存储格式)的 I/O 连接器。
- HL7v2: 用于 HL7v2 消息(一种临床消息格式,提供有关组织内部发生的事件的数据)的 I/O 连接器,它是 Google Cloud Healthcare API 的一部分。
- BoundedSource 包装器: 一个将现有 BoundedSource 实现转换为可拆分 DoFn 的包装器。
- UnboundedSource 包装器: 一个将现有 UnboundedSource 实现转换为可拆分 DoFn 的包装器。
Python 示例
- BoundedSourceWrapper: 一个将现有 BoundedSource 实现转换为可拆分 DoFn 的包装器。
Go 示例
- textio.ReadSdf 使用可拆分 DoFn 实现从文本文件读取。