啟用自動水平調度資源功能後,Dataflow 會為工作選擇適當數量的 worker 執行個體,並視需要新增或移除 worker。Dataflow 會根據 worker 的平均 CPU 使用率和管道的平行處理程度,調整資源規模。管道的平行處理級別,是指在任何指定時間,以最有效率的方式處理資料所需的執行緒數量估計值。
批次和串流管道都支援水平自動調度資源。
批次自動調度資源
所有批次管道預設會啟用水平自動調度資源。Dataflow 會根據管道各階段預估的工作總量,自動選擇 worker 數量。這項預估值取決於輸入大小和目前的處理量。Dataflow 每 30 秒會根據執行進度重新評估工作量。當預估工作總量增加或減少時,Dataflow 會動態調度資源,增加或減少 worker 數量。
工作站數量與工作量呈次線性關係。舉例來說,如果工作量增加一倍,工作站數量不會增加一倍。
如果發生下列任一情況,Dataflow 會維持或減少 worker 數量,以節省閒置資源:
- worker 的平均 CPU 使用率低於 5%。
- 由於無法平行處理的工作 (例如壓縮檔案或未分割的 I/O 模組導致資料無法分割),平行處理會受到限制。
- 平行處理程度固定,例如寫入 Cloud Storage 中的現有檔案時。
如要設定 worker 數量上限,請設定 --maxNumWorkers 管道選項。預設值為 2,000。
如要設定 worker 數量的下限,請設定 --dataflow-service-options=min_num_workers 服務選項。這些標記為選用。
串流自動調度資源
對於串流工作,Dataflow 可透過水平自動調度資源功能,根據負載和資源使用率的變化,彈性調整 worker 數量。
根據預設,使用 Streaming Engine 的串流工作會啟用水平自動調度資源。如要為未使用 Streaming Engine 的串流工作啟用水平自動調度資源,請在啟動管道時設定下列管道選項:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
將 MAX_WORKERS 替換為 worker 執行個體數量上限。
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
將 MAX_WORKERS 替換為 worker 執行個體數量上限。
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
將 MAX_WORKERS 替換為 worker 執行個體數量上限。
如要設定 worker 數量的下限,請設定 --dataflow-service-options=min_num_workers 服務選項。設定這個值後,水平自動調度資源功能就不會將 worker 數量縮減至低於指定數量。這個標記是選用的。
如果串流工作使用 Streaming Engine,您也可以設定延遲時間級別,藉此設定待處理工作閾值。
對於已在執行的串流工作,您可以使用執行中工作更新,更新 worker 數量下限、worker 數量上限或延遲時間級別。如要調整設定,請設定 min-num-workers、max-num-workers 或 latency-tier 旗標。詳情請參閱「調整串流管道的水平自動調度資源」。
停用水平自動調度資源功能
如要停用水平自動調度資源功能,請在執行工作時設定下列管道選項。
Java
--autoscalingAlgorithm=NONE
如果停用自動水平調度資源功能,Dataflow 會根據 --numWorkers 選項設定 worker 數量。
Python
--autoscaling_algorithm=NONE
如果停用自動水平調度資源功能,Dataflow 會根據 --num_workers 選項設定 worker 數量。
Go
--autoscaling_algorithm=NONE
如果停用自動水平調度資源功能,Dataflow 會根據 --num_workers 選項設定 worker 數量。
自訂來源
如果您建立自訂資料來源,可以實作方法,為水平自動調度資源演算法提供更多資訊,進而提升效能:
Java
有界來源
- 在
BoundedSource子類別中,實作getEstimatedSizeBytes方法。Dataflow 服務會使用getEstimatedSizeBytes,計算管道一開始要使用的 worker 數量。 - 在
BoundedReader子類別中,實作getFractionConsumed方法。Dataflow 服務會使用getFractionConsumed追蹤讀取進度,並在讀取期間收斂至正確的使用者數量。
無界限來源
來源必須向 Dataflow 服務回報待處理工作。待處理作業是指來源尚未處理的輸入內容,以位元組為單位。如要向服務通知待處理項目,請在 UnboundedReader 類別中實作下列任一方法。
getSplitBacklogBytes()- 來源的目前組別待處理作業。服務會匯總所有分割的待處理工作。getTotalBacklogBytes()- 所有組別的全域待處理作業。在某些情況下,待處理工作量不適用於每個分割,只能在所有分割中計算。只有第一個分割 (分割 ID「0」) 需要提供待處理工作總量。
Apache Beam 存放區包含多個實作 UnboundedReader 類別的自訂來源範例。
Python
有界來源
- 在
BoundedSource子類別中,實作estimate_size方法。Dataflow 服務會使用estimate_size,計算管道要使用的初始 worker 數量。 - 在
RangeTracker子類別中,實作fraction_consumed方法。Dataflow 服務會使用fraction_consumed追蹤讀取進度,並在讀取期間收斂至正確的使用者數量。
Go
有界來源
- 在
RangeTracker中實作GetProgress()方法。Dataflow 服務會使用GetProgress追蹤讀取進度,並在讀取期間收斂至正確的使用 worker 數量。
限制
- 在執行 Dataflow Prime 的工作中,水平自動調度資源功能會在垂直自動調度資源期間和之後最多 10 分鐘內停用。詳情請參閱「對自動水平調度資源的影響」。
- 如果管道未使用 Dataflow Shuffle,Dataflow 可能無法有效縮減 worker,因為 worker 可能已將重組資料儲存在本機磁碟。
- Apache Beam SDK 2.60.0 以上版本支援 PeriodicImpulse 轉換,並可搭配串流自動調度資源功能。如果管道使用
PeriodicImpulse搭配舊版 SDK,Dataflow worker 就不會按照預期縮減。