排解 Dataflow 自動調度資源問題

本頁面說明如何解決 Dataflow 自動調度資源功能的問題,並提供自動調度資源的管理資訊。

作業未向上擴充或縮減

本節提供相關情境的資訊,這些情境可能會導致工作者無法擴大或縮減規模。

串流工作未向上擴充

如果串流管道有待處理的工作,工作站就不會擴充資源。

如果積壓工作時間不到幾分鐘,或是平行處理受到限制,就會發生這個問題。

有時,待處理項目會增加,但平行處理程度會降低。在這種情況下,Dataflow 不會擴大,因為工作無法分配給更多工作站,因此新增工作站對處理作業沒有幫助。詳情請參閱「串流自動調度」。

批次和串流工作不會擴大

批次或串流工作正常執行,但需要更多工作站時,工作不會擴充資源。

這個問題可能是由以下原因造成:

  • 無法存取暫存或臨時檔案。如果工作使用 Cloud Storage bucket,該 bucket 可能有生命週期設定,會刪除 bucket 中的物件。刪除的物件包括暫存資料夾和檔案。 如要確認檔案是否已刪除,請檢查值區的生命週期設定。 如果工作開始後刪除了暫存資料夾或檔案,可能就沒有建立新工作站所需的套件。如要解決這個問題,請在值區中重新建立資料夾和檔案。
  • 防火牆規則會禁止工作站透過必要的 TCP 通訊埠傳送及接收流量。 防火牆規則可能會導致工作站無法啟動。 Dataflow 工作站必須能夠在 TCP 通訊埠 12345 和 12346 上傳送及接收流量。 如要進一步瞭解如何解決這個問題,請參閱「Dataflow 的防火牆規則」。
  • 自訂來源的 getProgress() 方法會傳回 NULL 值。 使用自訂來源時,待處理工作指標會依據自訂來源的 getProgress() 方法傳回的值,開始收集資料。getProgress() 的預設實作會傳回 NULL 值。如要解決這個問題,請確認自訂來源會覆寫預設的 getProgress() 方法,以便傳回非空值。
  • 由自動垂直調度資源功能觸發的更新,會暫時停用自動水平調度資源功能。詳情請參閱「對自動水平調度資源的影響」。
  • 如果您在 Python 管道中使用 map 作業,但作業未擴大,可能需要在管道程式碼中加入 Reshuffle 轉換。詳情請參閱 Apache Beam 說明文件中的「重新洗牌」。

串流工作未縮減

如果串流工作待處理工作數量較少,且 CPU 使用率偏低,工作站就不會縮減。這個問題可能有多種原因。

  • 如果工作未使用 Streaming Engine,Dataflow 會平衡工作站之間的永久磁碟數量。因此,每個工作站必須有相同數量的永久磁碟。舉例來說,如果磁碟和工作站各有 100 個,則每個工作站會分配到一個磁碟。工作縮減規模時,工作可以有 50 個工作站,每個工作站有兩個永久磁碟。工作不會再次縮減,直到工作站數量達到 25 個,且每個工作站有四個永久磁碟為止。此外,工作站數量下限是分配給 maxNumWorkers 的值除以 15。 詳情請參閱「串流管道的自動調度資源範圍」。

  • 工作使用 Streaming Engine 時,縮減目標會以 75% 的目標 CPU 使用率為準。如果無法達到這個 CPU 使用率,系統就會停用縮減規模功能。

  • 工作站縮減前,積壓工作時間估計值必須至少維持在 10 秒以下兩分鐘。積壓工作時間波動可能會停用縮減作業。此外,低輸送量可能會導致時間預估結果失真。

  • Apache Beam SDK 2.60.0 以上版本支援 PeriodicImpulse。如果管道使用 PeriodicImpulse,且 Apache Beam SDK 版本為 2.59.0 以下,Dataflow 工作站不會如預期縮減。

擴大停靠站

批次或串流工作開始調度資源,但即使仍有待處理的工作,工作站也不再調度資源。

如果達到配額限制,就會發生這個問題。

  • Compute Engine 配額:Dataflow 工作會受到專案的 Compute Engine 配額限制。如果有多個作業正在執行,專案可能已達到 Compute Engine 配額上限。在這種情況下,Dataflow 無法增加工作站數量。
  • CPU 配額:Dataflow 工作也受專案的 CPU 配額限制。如果工作站類型使用多個 CPU,專案可能已達到 CPU 配額上限。
  • 外部 IP 位址配額:當作業使用外部 IP 位址與資源通訊時,您需要的外部 IP 位址數量與工作人員數量相同。工作站數量增加時,外部 IP 位址數量也會增加。 達到 IP 位址上限時,工作站會停止擴充。

此外,如果所選區域已用盡某項資源,即使該區域或專案仍有配額,您也無法新建該類型的資源。舉例來說,您在 us-central1 中可能仍有建立外部 IP 位址的配額,但該地區可能已無法取得任何 IP 位址。詳情請參閱「配額與資源可用性」。

如要解決這個問題,請要求增加配額,或在其他區域執行作業。

工作人員使用率提示不會產生任何影響

您設定了工作人員使用率提示,但自動調度資源行為沒有改變。

如要瞭解這個問題,請前往「工作人員 CPU 使用率」圖表,並檢查系統是否積極採用工作人員使用率提示。如果使用提示,圖表會顯示 CPU utilization hint (actively used by autoscaler)。否則會顯示 CPU utilization hint (not actively used by autoscaler)

使用率提示只是影響自動調度資源的其中一個因素。下表列出自動配置器可能不會積極採用提示的幾個原因:

觀察到的資源調度行為 原因 要查看的指標
沒有變更
  • 工作站數量已達下限或上限。
  • 工作站數量受限於平行處理的索引鍵數量。
  • 外部 RPC 會限制工作。
  • 縮減調整幅度過小,或 Dataflow 抑制縮減。詳情請參閱「 串流自動調度資源啟發式方法」。
向上擴充
  • 積壓工作量過高或延遲目標會覆寫提示。
  • 工作站數量下限已更新為高於目前工作站數量的數值。
縮減
  • 工作站數量上限已更新為低於目前的工作站數量。

詳情請參閱「串流自動調度資源啟發式方法」。

自動調度指標的缺口

自動調度資源指標會出現短暫的暫時性間隔。

如果後端工作重新啟動,就可能發生這個問題。指標中的這些間隙並不代表自動調度資源或串流工作的健康狀態有問題。

CPU 分配不均

工作自動調度資源時,CPU 使用率在工作站間的分布不均。部分工作站的 CPU 使用率、系統延遲時間或資料更新間隔高於其他工作站。

如果資料含有熱鍵,就可能發生這個問題。熱鍵是具備足夠元素,可對管道效能造成負面影響的索引鍵。每個鍵都必須由單一工作站處理,因此工作無法在工作站之間分割。

詳情請參閱熱鍵錯誤指南

後端已不再允許讀取要求狀態的工作項目

在串流管道中,工作站 VM 執行個體與 Streaming Engine 工作通訊時,會發生下列錯誤:

The work item requesting state read is no longer valid on the backend.
The work has already completed or will be retried.
This is expected during autoscaling events.

自動調度資源期間,工作站 VM 執行個體會與多個 Streaming Engine 工作通訊,而每個工作會為多個工作站 VM 執行個體提供服務。項目鍵用於分配工作。每個工作和工作站 VM 執行個體都有一組索引鍵範圍,這些範圍的分配方式可能會動態變更。舉例來說,在自動調度資源期間,作業大小調整可能會導致鍵範圍分布情形改變。如果金鑰範圍有所變更,就可能發生這個錯誤。 這是預期會發生的錯誤,除非您發現這些訊息與管道成效不佳有關,否則可以忽略。

Streaming Engine 資源不足

如果 Streaming Engine 無法分配您要求的工作站數量下限,系統會傳回下列錯誤:

Streaming Engine does not currently have enough resources available to fulfill
the request.

如要解決這個問題,請嘗試設定較少的工作站數量下限。請參閱「設定自動調度範圍」。

串流管道的自動調度資源範圍

本節詳細說明串流管道的自動調度資源範圍。

Java

針對不使用 Streaming Engine 的串流自動調度資源工作,Dataflow 服務會分配 1 到 15 個永久磁碟給每個工作站。也就是說,用於串流自動調度資源管道的工作站數量下限為 N/15,其中 N 是 --maxNumWorkers 的值。

針對使用 Streaming Engine 的串流自動調度資源工作,工作站數量下限為 1。

Dataflow 會平衡工作站之間的永久磁碟數量。舉例來說,如果您的管道在穩定狀態下需要三到四個工作站,您可以設定 --maxNumWorkers=15。管道在調度資源時就會使用 1、2、3、4、5、8 或 15 個工作站,在 1 到 15 個工作站之間自動進行調度;這分別對應至 15、8、5、4、3、2 或 1 個永久磁碟 (每個工作站)。

--maxNumWorkers 的上限是 1000。

Python

針對不使用 Streaming Engine 的串流自動調度資源工作,Dataflow 服務會分配 1 到 15 個永久磁碟給每個工作站。也就是說,用於串流自動調度資源管道的工作站數量下限為 N/15,其中 N 是 --max_num_workers 的值。

針對使用 Streaming Engine 的串流自動調度資源工作,工作站數量下限為 1。

Dataflow 會平衡工作站之間的永久磁碟數量。舉例來說,如果您的管道在穩定狀態下需要三到四個工作站,您可以設定 --max_num_workers=15。管道在調度資源時就會使用 1、2、3、4、5、8 或 15 個工作站,在 1 到 15 個工作站之間自動進行調度;這分別對應至 15、8、5、4、3、2 或 1 個永久磁碟 (每個工作站)。

--max_num_workers 的上限是 1000。

Go

針對不使用 Streaming Engine 的串流自動調度資源工作,Dataflow 服務會分配 1 到 15 個永久磁碟給每個工作站。也就是說,用於串流自動調度資源管道的工作站數量下限為 N/15,其中 N 是 --max_num_workers 的值。

針對使用 Streaming Engine 的串流自動調度資源工作,工作站數量下限為 1。

Dataflow 會平衡工作站之間的永久磁碟數量。舉例來說,如果您的管道在穩定狀態下需要三到四個工作站,您可以設定 --max_num_workers=15。管道在調度資源時就會使用 1、2、3、4、5、8 或 15 個工作站,在 1 到 15 個工作站之間自動進行調度;這分別對應至 15、8、5、4、3、2 或 1 個永久磁碟 (每個工作站)。

--max_num_workers 的上限是 1000。

串流自動調度資源可使用的工作站數量上限

Java

Dataflow 在調度資源時,必須遵守您專案的 Compute Engine 執行個體數量配額或 maxNumWorkers 的限制,以數量低者為準。

Python

Dataflow 在調度資源時,必須遵守您專案的 Compute Engine 執行個體數量配額或 max_num_workers 的限制,以數量低者為準。

Go

Dataflow 在調度資源時,必須遵守您專案的 Compute Engine 執行個體數量配額或 max_num_workers 的限制,以數量低者為準。

限制自動調度功能,減少對帳單的影響

如要避免自動調度資源功能增加帳單費用,可以限制串流工作可用的工作站數量上限。

Java

您可以指定 --maxNumWorkers,限制用來處理工作的資源調度範圍。

Python

您可以指定 --max_num_workers,限制用來處理工作的資源調度範圍。

Go

您可以指定 --max_num_workers,限制用來處理工作的資源調度範圍。

變更資源調度範圍

如要瞭解如何變更串流管道的資源調度範圍,請參閱設定自動調度範圍

關閉串流管道的自動調度資源功能

如要關閉串流管道的自動調度資源功能,請按照下列步驟操作。

Java

請設定 --autoscalingAlgorithm=NONE。詳情請參閱「停用自動水平調度資源」。

Python

請設定 --autoscaling_algorithm=NONE。詳情請參閱「停用自動水平調度資源」。

Go

請設定 --autoscaling_algorithm=NONE。詳情請參閱「停用自動水平調度資源」。

使用固定數量的工作人員

對於不使用 Streaming Engine 的串流工作,預設行為是使用固定數量的工作站。如要搭配這些管道使用串流自動調度資源,必須明確選擇啟用,因為這項功能預設為關閉。