使用「pause-on-failure」服務選項,保留 Dataflow 批次工作的狀態。這項功能可讓您暫停執行作業、解決管道外部的問題,以及繼續處理作業,而不會遺失已完成的工作。使用這項功能暫停工作後,您就無法變更管道程式碼或 worker VM 設定,例如機型。
啟用這項功能後,您就能在暫時中斷或配額限制期間,更妥善地管理資源成本,並提升工作可靠性。啟用「失敗時暫停」功能後,您還可以設定暫停時間上限,進一步控管管道生命週期。您也可以手動暫停或繼續執行已啟用 pause-on-failure 旗標的管道。
失敗時暫停的好處
如果選用「失敗時暫停」服務選項,就能在作業中斷期間保留批次工作進度,進而減少總運算時間和資源支出。
- 保留檢查點:工作失敗時,您可以從上次記錄的檢查點繼續執行,不必從頭開始。這樣一來,您就不必重新處理已完成的資料區塊,也不必為已順利完成的工作付費。
- 減少外部依附元件:保護管道免於暫時性問題影響,例如外部服務暫時中斷或速率限制。暫停作業後,您就能在繼續執行作業前找出根本原因,且不會遺失已完成的工作。
- 處理非確定性失敗:如果工作負載容易發生間歇性或非確定性失敗,這個選項可確保每次連續嘗試都能累加進度,避免工作全面失敗。
- 管理資源和配額:暫停優先順序較低的批次工作,暫時釋出配額或將 GPU 或 TPU 等高價值資源重新分配給緊急工作負載,例如機器學習模型訓練或推論,同時保留基準進度。
支援與限制
暫停工作 (手動或因失敗而暫停) 須符合下列規定和限制:
- Dataflow 工作必須是批次工作。
- 工作必須使用 Dataflow Shuffle。
- 執行工作時,您必須指定
pause_on_failure服務選項。 - 工作先前不得無法暫停。
失敗時暫停工作
啟用「失敗時暫停」功能後,工作項目失敗四次時,工作就會自動暫停。您可以在記錄檔中找出這些失敗情形,方法是查看含有 Error message from worker 的工作訊息,以及含有 Completed work item ITEM_NUMBER
UNSUCCESSFULLY 的 worker 訊息。其他類型的失敗 (例如缺貨和配額錯誤) 則不會觸發自動暫停。而是會導致工作正常失敗。啟用「失敗時暫停」功能後,您也可以手動暫停工作。
工作狀態轉換
Dataflow 工作暫停時,會經歷下列狀態:
- 暫停:中間狀態,工作會停止處理作業、刪除工作站 VM,並封存後端狀態。在服務完成刪除 VM 之前,您仍須支付相關費用。
- 已暫停:工作已完全停止。此時,您只需支付已封存的 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 工作
如要手動暫停工作,請執行下列步驟。
控制台
gcloud
如要暫停 Dataflow 工作,請在 Cloud Shell 或已安裝 gcloud CLI 的本機終端機中,使用 gcloud dataflow
jobs 指令。
開啟殼層。
列出正在執行的 Dataflow 工作 ID,然後記下要暫停的工作 ID:
gcloud dataflow jobs list如果未設定
--region標記,系統會顯示所有可用地區的 Dataflow 工作。執行下列指令:
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 工作
如要手動繼續執行已暫停的工作,請按照下列步驟操作:
控制台
前往 Dataflow 的「Jobs」(工作) 頁面:
按一下要繼續執行的工作。
如要繼續工作,工作狀態必須為「已暫停」(而非「暫停中」)。
在工作詳細資料頁面中,按一下「繼續」。
gcloud
如要繼續執行 Dataflow 工作,請在 Cloud Shell 或已安裝 gcloud CLI 的本機終端機中,使用 gcloud dataflow
jobs 指令。
開啟殼層。
列出已暫停的 Dataflow 工作 ID,然後記下要繼續執行的工作 ID:
gcloud dataflow jobs list如果未設定
--region標記,系統會顯示所有可用地區的 Dataflow 工作。執行下列指令:
gcloud dataflow jobs resume JOB_ID --region=REGION將 JOB_ID 替換為工作 ID,並將 REGION 替換為工作區域。
API
如要使用 Dataflow REST API 繼續執行工作,請使用 projects.locations.jobs.update 端點,並傳遞下列要求主體:
{
"requestedState": "JOB_STATE_RUNNING"
}
後續步驟
- 瞭解如何停止執行中的管道。
- 瞭解批次作業的 Dataflow Shuffle,這是使用這項功能的前提。
- 請參閱「排解管道問題」指南,解決錯誤。
- 瞭解如何排解批次工作執行緩慢或停滯的問題。