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 连接器变得更加容易,代码更加简单且可重用。

与现有的 UnboundedSourceBoundedSource 相比,SDF 有三个优势

  • SDF 提供了一套统一的 API 来处理无界和有界情况。
  • SDF 支持从源描述符动态读取。
    • 以 KafkaIO 为例,在 UnboundedSource/BoundedSource API 中,您必须在管道构建时指定要从中读取的主题和分区。UnboundedSource/BoundedSource 无法在执行时接受主题和分区作为输入。但 SDF 具有此功能。
  • SDF 能够自由拆分,可以作为管道中的任何节点。
    • UnboundedSource/BoundedSource 必须是管道的根节点才能从拆分策略中获得性能优势,这限制了许多实际应用。这对 SDF 来说不再是限制。

由于 SDF 现在已经可以与所有提到的改进一起使用,因此它成为构建新的 I/O 连接器的推荐方式。请遵循 编程指南 尝试构建自己的可拆分 DoFn。我们在 Beam SDK 中提供了大量的通用实用类,例如 RestrictionTrackerWatermarkEstimator 的常见类型,可以帮助您轻松上手。对于现有的 I/O 连接器,我们已经将 UnboundedSourceBoundedSource 实现包装到了可拆分 DoFn 中,但我们仍然鼓励开发人员将 UnboundedSource/BoundedSource 转换为实际的可拆分 DoFn 实现,以获得更高的性能优势。

非常感谢每位将这项备受期待的设计带入数据处理领域的贡献者。我们非常期待看到用户从 SDF 中获益。

以下是一些供您探索的实际 SDF 示例。

实际可拆分 DoFn 示例

Java 示例

Python 示例

Go 示例