暫停 Dataflow 工作

使用「pause-on-failure」服務選項,保留 Dataflow 批次工作的狀態。這項功能可讓您暫停執行作業、解決管道外部的問題,以及繼續處理作業,而不會遺失已完成的工作。使用這項功能暫停工作後,您就無法變更管道程式碼或 worker VM 設定,例如機型。

啟用這項功能後,您就能在暫時中斷或配額限制期間,更妥善地管理資源成本,並提升工作可靠性。啟用「失敗時暫停」功能後,您還可以設定暫停時間上限,進一步控管管道生命週期。您也可以手動暫停或繼續執行已啟用 pause-on-failure 旗標的管道。

失敗時暫停的好處

如果選用「失敗時暫停」服務選項,就能在作業中斷期間保留批次工作進度,進而減少總運算時間和資源支出。

  • 保留檢查點:工作失敗時,您可以從上次記錄的檢查點繼續執行,不必從頭開始。這樣一來,您就不必重新處理已完成的資料區塊,也不必為已順利完成的工作付費。
  • 減少外部依附元件:保護管道免於暫時性問題影響,例如外部服務暫時中斷或速率限制。暫停作業後,您就能在繼續執行作業前找出根本原因,且不會遺失已完成的工作。
  • 處理非確定性失敗:如果工作負載容易發生間歇性或非確定性失敗,這個選項可確保每次連續嘗試都能累加進度,避免工作全面失敗。
  • 管理資源和配額:暫停優先順序較低的批次工作,暫時釋出配額或將 GPU 或 TPU 等高價值資源重新分配給緊急工作負載,例如機器學習模型訓練或推論,同時保留基準進度。

支援與限制

暫停工作 (手動或因失敗而暫停) 須符合下列規定和限制:

失敗時暫停工作

啟用「失敗時暫停」功能後,工作項目失敗四次時,工作就會自動暫停。您可以在記錄檔中找出這些失敗情形,方法是查看含有 Error message from worker 的工作訊息,以及含有 Completed work item ITEM_NUMBER UNSUCCESSFULLY 的 worker 訊息。其他類型的失敗 (例如缺貨和配額錯誤) 則不會觸發自動暫停。而是會導致工作正常失敗。啟用「失敗時暫停」功能後,您也可以手動暫停工作。

工作狀態轉換

Dataflow 工作暫停時,會經歷下列狀態:

  1. 暫停:中間狀態,工作會停止處理作業、刪除工作站 VM,並封存後端狀態。在服務完成刪除 VM 之前,您仍須支付相關費用。
  2. 已暫停:工作已完全停止。此時,您只需支付已封存的 Shuffle 資料費用。

例外行為

在下列情況中,失敗時暫停功能可能會出現非預期的行為:

  • 如果手動暫停即將完成的工作,系統可能會完成工作,而不是暫停。
  • 在極少數情況下,工作可能無法暫停。在這些情況下,如果工作是因錯誤而暫停,則會進入失敗狀態;如果是手動暫停,則會返回執行狀態。

繼續處理

工作恢復後,服務會依下列方式處理工作項目:

  • 已完成的工作:服務不會重新處理工作暫停時已完全完成的任何階段或工作項目。
  • 進行中的工作:工作暫停時正在處理的任何工作項目,都會從頭重新處理。
  • 失敗次數:所有工作項目失敗次數都會重設為零,這表示工作項目再失敗四次前,工作不會自動暫停。

啟用「失敗時暫停」功能

如要為工作啟用「失敗時暫停」功能,請在執行工作時使用 pause_on_failure Dataflow 服務選項。

Java

--dataflowServiceOptions=pause_on_failure

Python

--dataflow_service_options=pause_on_failure

Go

--dataflow_service_options=pause_on_failure

指定暫停時間長度上限

根據預設,工作會暫停最多 7 天 (7d)。您可以手動設定最長暫停時間,範圍介於 1 小時 (1h) 和 7 天 (7d) 之間。

系統僅支援 d (天) 和 h (小時)。一天定義為 24 小時。 由於日光節約時間等因素,這可能與日曆天數的長度不符。

暫停時間超過上限後,系統會取消工作,且無法再繼續執行。

舉例來說,以下範例將暫停時間上限設為 1 天:

Java

--dataflowServiceOptions=pause_on_failure=pause_duration:1d

Python

--dataflow_service_options=pause_on_failure=pause_duration:1d

Go

--dataflow_service_options=pause_on_failure=pause_duration:1d

手動暫停 Dataflow 工作

如要手動暫停工作,請執行下列步驟。

控制台

  1. 前往 Dataflow 的「Jobs」(工作) 頁面:

    前往工作

  2. 按一下要暫停的工作。

    如要暫停工作,工作狀態必須為「執行中」

  3. 在工作詳細資料頁面中,按一下「暫停」

    如果沒有看到「暫停」按鈕,表示由於暫停失敗限制,您的工作無法暫停。

gcloud

如要暫停 Dataflow 工作,請在 Cloud Shell 或已安裝 gcloud CLI 的本機終端機中,使用 gcloud dataflow jobs 指令

  1. 開啟殼層。

  2. 列出正在執行的 Dataflow 工作 ID,然後記下要暫停的工作 ID:

    gcloud dataflow jobs list
    

    如果未設定 --region 標記,系統會顯示所有可用地區的 Dataflow 工作。

  3. 執行下列指令:

    gcloud dataflow jobs pause JOB_ID --region=REGION
    

    JOB_ID 換成您記下的工作 ID,並將 REGION 換成工作區域。

API

如要使用 Dataflow REST API 暫停工作,請使用 projects.locations.jobs.update 端點,並傳遞下列要求主體:

{
  "requestedState": "JOB_STATE_PAUSING"
}

重要事項:請勿不慎將 JOB_STATE_PAUSED 做為 requestedState 傳遞。

取消暫停或已暫停的 Dataflow 工作

您可以照常取消暫停中或已暫停的 Dataflow 工作。取消職缺後,系統不會再向你收費,但職缺無法再恢復。

暫停的工作會在最長暫停時間到期後自動取消。

繼續執行 Dataflow 工作

如要手動繼續執行已暫停的工作,請按照下列步驟操作:

控制台

  1. 前往 Dataflow 的「Jobs」(工作) 頁面:

    前往工作

  2. 按一下要繼續執行的工作。

    如要繼續工作,工作狀態必須為「已暫停」(而非「暫停中」)。

  3. 在工作詳細資料頁面中,按一下「繼續」

gcloud

如要繼續執行 Dataflow 工作,請在 Cloud Shell 或已安裝 gcloud CLI 的本機終端機中,使用 gcloud dataflow jobs 指令

  1. 開啟殼層。

  2. 列出已暫停的 Dataflow 工作 ID,然後記下要繼續執行的工作 ID:

    gcloud dataflow jobs list
    

    如果未設定 --region 標記,系統會顯示所有可用地區的 Dataflow 工作。

  3. 執行下列指令:

    gcloud dataflow jobs resume JOB_ID --region=REGION
    

    JOB_ID 替換為工作 ID,並將 REGION 替換為工作區域。

API

如要使用 Dataflow REST API 繼續執行工作,請使用 projects.locations.jobs.update 端點,並傳遞下列要求主體:

{
  "requestedState": "JOB_STATE_RUNNING"
}

後續步驟