Dataflow 以開放原始碼的 Apache Beam 專案為基礎。本文說明 Apache Beam 程式設計模型。
總覽
Apache Beam 是開放原始碼形式的整合式模型,可定義批次和串流管道。Apache Beam 程式設計模型簡化了大規模資料處理的機制。您要先使用其中一種 Apache Beam SDK 建構用來定義管道的程式,接著,您可以在特定平台 (例如 Dataflow) 上執行管道。這個模型可讓您專注於資料處理工作的邏輯組合,而不是管理平行處理作業的自動化調度管理。
Apache Beam 可讓您免於處理低層級的分散式處理作業,像是協調個別工作站、分割資料集和其他類似工作。這類低層級的執行細節可全部交給 Dataflow 代管。
管道是套用至資料集合的轉換圖。在 Apache Beam 中,集合稱為 PCollection
,轉換則稱為 PTransform
。PCollection
可以是受限或不受限。
受限 PCollection
的大小固定且已知,可使用批次管道處理。無邊界 PCollections
必須使用串流管道,因為資料會在抵達時處理。
Apache Beam 提供連接器,可從不同系統讀取及寫入資料,包括 Google Cloud 服務和第三方技術,例如 Apache Kafka。
下圖顯示 Apache Beam 管道。
您可以編寫 PTransforms
執行任意邏輯。Apache Beam SDK 也提供實用的 PTransforms
程式庫,包括:
- 篩除所有不符合述詞的元素。
- 對每個元素套用一對一對應函式。
- 依據鍵將元素分組。
- 計算集合中的元素
- 計算鍵/值集合中與每個鍵相關聯的元素。
如要使用 Dataflow 執行 Apache Beam 管道,請完成下列步驟:
- 使用 Apache Beam SDK 定義及建構管道。或者,您也可以使用 Dataflow 範本部署預建管道。
- 使用 Dataflow 執行管道。Dataflow 會分配 VM 集區來執行工作、將程式碼部署至 VM,並協調執行工作。
- Dataflow 會在後端執行最佳化作業,讓管道有效率地執行,並充分運用平行化功能。
- 工作執行期間和完成後,您可以使用 Dataflow 管理功能監控進度及排解問題。
Apache Beam 概念
本節將統整基本概念。
基本概念
- pipeline
- 管道會封裝與讀取輸入資料、轉換該資料,以及寫入輸出資料相關的所有運算作業。輸入來源和輸出接收器的類型可以相同,也可以是不同類型,因此您可以轉換資料格式。Apache Beam 程式會先建構
Pipeline
物件,接著以該物件為基礎建立管道的資料集。每個管道都代表一項可能會重複進行的工作。 - PCollection
PCollection
是可能為分散式的多元素資料集,可做為管道的資料使用。Apache Beam 轉換會使用PCollection
物件做為管道中每個步驟的輸入和輸出。可存放固定大小的資料集,或是資料來源會持續更新的不受限資料集。- 轉換
- 轉換是用來負責轉換資料的處理作業,轉換會將一或多個
PCollection
做為輸入資料,對該集合中的每個元素執行您指定的作業,並產生一或多個PCollection
做為輸出資料。轉換可以執行幾乎任何類型的處理作業,包括對資料執行數學運算、將資料從一種格式轉換為另一種格式、將資料分組、讀取及寫入資料、篩選資料以僅輸出所需元素,或將資料元素合併為單一值。 - ParDo
ParDo
是 Apache Beam SDK 中的核心平行處理作業,可對輸入PCollection
的每個元素叫用使用者指定的函式。ParDo
會收集零或多個輸出元素並加入輸出PCollection
中。ParDo
轉換會獨立處理元素,且可能會以平行的方式進行處理。ParDo
的使用者定義函式稱為DoFn
。- 管道 I/O
- Apache Beam I/O 連接器可讓您將資料讀取至管道,並從管道寫入輸出資料。I/O 連接器是由一個來源和一個接收器組成。所有的 Apache Beam 來源和接收器均為轉換,可讓您的管道支援多種不同的資料儲存格式。您也可以編寫自訂 I/O 連接器。
- 匯總
- 匯總是計算多個輸入元素中部分值的過程。在 Apache Beam 中,主要的匯總運算模式為將具有相同鍵和時間區間的所有元素分為一組,接著使用關聯和交換式作業合併各組元素。
- 使用者定義的函式 (UDF)
- 在 Apache Beam 中,部分作業允許執行使用者定義的程式碼來設定轉換。如果是
ParDo
,使用者定義的程式碼會指定要套用到各個元素的作業;如果是Combine
,使用者定義的程式碼則會指定值的合併方式。管道包含的 UDF 可能是以與執行器不同的語言編寫而成,且管道可能包含以多種程式設計語言編寫的 UDF。 - 執行器
- 執行器是接受並執行管道的軟體。大多數的執行器為適用於大規模平行大數據處理系統的轉譯器或轉換器,但也有用於本機測試和偵錯的執行器。
- 來源
- 從外部儲存系統讀取的轉換。管道通常會從來源讀取輸入資料。來源的類型可能與接收器類型不同,因此您可以在資料通過管道時變更資料格式。
- 接收器
- 將資料寫入外部資料儲存系統的轉換,例如檔案或資料庫。
- TextIO
- 用於讀取及寫入文字檔的 PTransform。TextIO 來源和接收器支援以
gzip
和bzip2
壓縮的檔案。TextIO 輸入來源支援 JSON。但如果要讓 Dataflow 服務能夠平行處理輸入和輸出,您必須使用換行字元分隔來源資料。您可以使用規則運算式,鎖定具有 TextIO 來源的特定檔案。Dataflow 支援一般萬用字元模式。您的 glob 運算式可以出現在路徑中的任何位置。不過,Dataflow 不支援遞迴萬用字元 (**
)。
PCollection
進階概念
- 事件時間
- 資料事件發生的時間,取決於資料元素本身的時間戳記。與此相對的是實際資料元素在管道中任何階段進行處理的時間。
- 時間區間設定
- 時間區間設定可根據個別元素的時間戳記,把集合分為多個有限集合時間區間,藉此將不受限集合分組。時間區間函式會指示執行器如何將元素指派給初始時間區間,以及如何合併分組元素的時間區間。Apache Beam 可讓您定義不同種類的時間區間,或使用預先定義的時間區間函式。
- 浮水印
- Apache Beam 會追蹤浮水印,這是一種系統概念,表示可預期的某個時間區間內,所有資料抵達管道的時間。由於資料不保證一定會依時間順序或依可預測的時間間隔抵達管道,因此 Apache Beam 才要追蹤浮水印。此外,資料事件不保證會以產生的順序顯示在管道中。
- 觸發條件
- 觸發條件可用來決定資料到達時發送匯總結果的時機。如果是受限資料,系統會在所有輸入都處理完畢後發送結果;如果是不受限資料,系統會在浮水印超過時間區間結尾時發送結果,表示其認為該時間區間的所有輸入資料均已處理完畢。Apache Beam 提供幾種預先定義的觸發條件,讓您自由搭配使用。
後續步驟
- 如要進一步瞭解使用 Apache Beam SDK 建構管道的基本概念,請參閱 Apache Beam 說明文件中的 Apache Beam 程式設計指南。
- 如要進一步瞭解 Dataflow 支援的 Apache Beam 功能,請參閱 Apache Beam 功能矩陣。