Dataflow 服務的「動態重新平衡工作」功能可讓服務根據執行階段的狀況,動態重新分割工作。這些條件可能包括:
- 工作指派不平衡
- 工作站完成工作的時間比預期更慢
- 工作站完成工作的時間比預期更快
Dataflow 服務會自動偵測這些狀況,然後動態地將工作指派給未使用或未充分利用的工作站,以縮短工作的整體處理時間。
限制
「動態重新平衡工作」只會在 Dataflow 服務平行處理一些輸入資料時發揮作用,這包括從外部輸入來源讀取資料時,處理具體化中繼 PCollection
時,或處理像是 GroupByKey
的匯總結果時。如果您融合了工作中的許多步驟,工作中的中繼 PCollection
數量將會減少,並且「動態重新平衡工作」將會受限於來源具體化 PCollection
中的元素數量。如要確保動態重新平衡工作可套用至管道中的特定 PCollection
,您可以透過幾種方法來避免融合,讓工作得以進行動態平行處理。
「動態重新平衡工作」無法對比單筆記錄更精細的資料進行重新平行處理。 如果資料中包含會造成處理時間大幅延遲的記錄,這些記錄可能也會延遲您的工作。Dataflow 無法細分個別的「熱門」記錄,也無法將其重新分配給多個工作站。
Java
如果您為管道的最終輸出設定了固定數量的資料分割 (例如使用 TextIO.Write.withNumShards
寫入資料),Dataflow 會根據您選擇的資料分割數量來限制平行處理。
Python
如果您為管道的最終輸出設定了固定數量的資料分割 (例如使用 beam.io.WriteToText(..., num_shards=...)
寫入資料),Dataflow 會根據您選擇的資料分割數量來限制平行處理。
Go
如果您為管道的最終輸出設定了固定數量的資料分割,Dataflow 會根據您選擇的資料分割數量來限制平行處理。
使用自訂資料來源
Java
如果管道使用您提供的自訂資料來源,您必須實作 splitAtFraction
方法,才能讓您的資料來源使用動態重新平衡工作功能。
如果您未正確實作 splitAtFraction
,資料來源的記錄可能會重複或遭到捨棄。如需實作 splitAtFraction
的說明和提示,請參閱 RangeTracker 的 API 參考資料。
Python
如果管道使用您提供的自訂資料來源,您的 RangeTracker
必須實作 try_claim
、try_split
、position_at_fraction
和 fraction_consumed
,才能讓您的資料來源使用「動態重新平衡工作」功能。
詳情請參閱「RangeTracker 的 API 參考資料」一文。
Go
如果管道使用您提供的自訂資料來源,則必須實作有效的 RTracker
,才能讓來源使用動態重新平衡工作功能。
詳情請參閱 RTracker API 參考資料。
系統會使用自訂來源的 getProgress()
方法傳回的值,啟動動態工作重新平衡。getProgress()
的預設實作會傳回 null
。如要確保自動調整資源配置功能順利啟動,請確認自訂來源會覆寫 getProgress()
,以便傳回適當的值。