部落格
2020/12/14
Apache Beam 中的可分割 DoFn 已可使用
Boyuan Zhang
我們很高興地宣布,可分割 DoFn (SDF) 已可在 Beam Python、Java 和 Go SDK 的 2.25.0 及更高版本中使用。
在 2017 年,可分割 DoFn 部落格文章 提議建立 可分割 DoFn API,作為建立 I/O 連接器的新建議方式。可分割 DoFn 是 DoFn
的一般化,它賦予其 Source
的核心功能,同時保留 DoFn
的語法、彈性、模組化和易於編碼的特性。因此,使用更簡單和可重複使用的程式碼開發複雜的 I/O 連接器變得容易得多。
SDF 比現有的 UnboundedSource
和 BoundedSource
有三個優勢
- 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 從文字檔案讀取的功能。