動態重新平衡工作

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_claimtry_splitposition_at_fractionfraction_consumed,才能讓您的資料來源使用「動態重新平衡工作」功能。

詳情請參閱「RangeTracker 的 API 參考資料」一文。

Go

如果管道使用您提供的自訂資料來源,則必須實作有效的 RTracker,才能讓來源使用動態重新平衡工作功能。

詳情請參閱 RTracker API 參考資料

系統會使用自訂來源的 getProgress() 方法傳回的值,啟動動態工作重新平衡。getProgress() 的預設實作會傳回 null。如要確保自動調整資源配置功能順利啟動,請確認自訂來源會覆寫 getProgress(),以便傳回適當的值。