概述:開發新的 I/O 連接器

針對需要連線至 內建 I/O 連接器 不支援的資料儲存區的使用者指南

若要連線至 Beam 現有 I/O 連接器不支援的資料儲存區,您必須建立自訂 I/O 連接器。連接器通常包含來源和接收器。所有 Beam 來源和接收器都是複合轉換;不過,自訂 I/O 的實作取決於您的使用案例。以下是開始使用的建議步驟

  1. 閱讀此概述並選擇您的實作。如有任何問題,可以寄電子郵件至 Beam 開發郵件清單。此外,您可以檢查是否有人正在處理相同的 I/O 連接器。

  2. 如果您計畫將 I/O 連接器貢獻給 Beam 社群,請參閱 Apache Beam 貢獻指南

  3. 請閱讀 PTransform 樣式指南,以取得其他樣式指南建議。

來源

針對有界限(批次)來源,目前有兩種選項可建立 Beam 來源

  1. 使用 Splittable DoFn

  2. 使用 ParDoGroupByKey

Splittable DoFn 是建議的選項,因為它是最新的有界限和無界限來源的來源架構。這表示在新的系統中取代 Source API ( BoundedSourceUnboundedSource)。請閱讀 可分割 DoFn 程式設計指南,以了解如何撰寫一個可分割 DoFn。如需詳細資訊,請參閱多 SDK 連接器工作的路線圖

針對 Java 和 Python 無界限 (串流) 來源,您必須使用 Splittable DoFn,它支援對串流管道有用的功能,包括檢查點、控制浮水印和追蹤待辦項目。

何時使用可分割 DoFn 介面

如果您不確定是否要使用 Splittable DoFn,請隨時寄電子郵件至 Beam 開發郵件清單,我們可以討論您案例的具體優缺點。

在某些情況下,實作 Splittable DoFn 可能有必要或會帶來較佳的效能

例如,如果您想要從每個檔案包含許多記錄的新檔案格式讀取,或者如果您想要從支援依排序索引鍵順序讀取作業的索引鍵值儲存區讀取。

使用 SDF 的 I/O 範例

Java 範例

Python 範例

使用 ParDo 和 GroupByKey

對於可以平行讀取資料的資料儲存或檔案類型,您可以將此過程視為一個小型管道。這通常包含兩個步驟

  1. 將資料分割成數個部分以平行讀取

  2. 從每個部分讀取資料

每個步驟都會是一個 ParDo,中間夾著一個 GroupByKeyGroupByKey 是一個實作細節,但對於大多數執行器來說,GroupByKey 允許執行器在某些情況下使用不同數量的 worker。

此外,GroupByKey 也允許在支援此功能的執行器上進行動態工作重新平衡。

以下是一些讀取轉換實作的範例,這些實作在可以平行讀取資料時使用「以小型管道方式讀取」模型

對於無法平行讀取的資料儲存或檔案,讀取是一個簡單的任務,可以使用單個 ParDo+GroupByKey 完成。例如

接收器

要建立 Beam sink,我們建議您使用將接收到的記錄寫入資料儲存的 ParDo。要開發更複雜的 sink(例如,在執行器重試失敗時支援資料去重複),請使用 ParDoGroupByKey 和其他可用的 Beam 轉換。許多資料服務都最佳化為一次寫入批次的元素,因此在寫入之前將元素分組為批次可能是有意義的。持續性連線也可以在 DoFn 的 setUpstartBundle 方法中初始化,而不是在收到每個元素時初始化。還應注意,在大型分散式系統中,工作可能會 失敗和/或重試,因此盡可能使外部互動具有冪等性是較佳的。

對於基於檔案的 sink,您可以使用 Java 和 Python SDK 提供的 FileBasedSink 抽象。Beam 的 FileSystems 公用程式類別對於讀取和寫入檔案也很有用。請參閱我們的語言特定實作指南以了解更多詳細資訊