Apache Beam 中的可分割 DoFn 已可使用

我們很高興地宣布,可分割 DoFn (SDF) 已可在 Beam Python、Java 和 Go SDK 的 2.25.0 及更高版本中使用。

在 2017 年,可分割 DoFn 部落格文章 提議建立 可分割 DoFn API,作為建立 I/O 連接器的新建議方式。可分割 DoFn 是 DoFn 的一般化,它賦予其 Source 的核心功能,同時保留 DoFn 的語法、彈性、模組化和易於編碼的特性。因此,使用更簡單和可重複使用的程式碼開發複雜的 I/O 連接器變得容易得多。

SDF 比現有的 UnboundedSourceBoundedSource 有三個優勢

  • 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 範例

  • textio.ReadSdf 實作使用可分割 DoFn 從文字檔案讀取的功能。