本頁說明如何在全部或部分工作失敗後,自動重試工作。
如果 Batch 工作中至少有一項工作失敗,該工作就會失敗,而這可能有多種原因。根據預設,工作中的每項工作只會執行一次;如果工作失敗,系統不會重試。不過,如果工作失敗的原因很簡單,只要重試工作就能解決問題。在這些情況下,將工作設定為自動重試工作,可大幅減少疑難排解的摩擦,並縮短工作整體執行時間。
自動重試功能非常適合鬆耦合 (獨立) 工作,有助於解決各種問題。舉例來說,自動重試工作可解決下列時效性問題:
- Spot VM 的搶占
- VM 維護事件和主機錯誤
- 暫時性網路錯誤
建立工作時,您可以為每個工作設定自動重試次數。具體來說,您可以針對每項工作使用下列任一設定選項:
- 根據預設,每個工作失敗時都不會重試。
- 重試所有失敗的工作:您可以設定自動重試失敗工作的次數上限。您可以指定 0 (預設值) 到 10 次重試。
- 針對部分失敗情況重試工作: 您可以針對特定失敗情況,設定不同的工作動作,例如自動重試或失敗但不重試。對於所有未指定的失敗,系統會採取相反的動作。 您可以透過應用程式或 Batch 定義的結束代碼,識別各項特定失敗。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
-
如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor
) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
重試所有失敗的工作
您可以使用 gcloud CLI 或 Batch API,為工作失敗的作業定義自動重試次數上限 (maxRetryCount
欄位)。
gcloud
建立 JSON 檔案,指定作業的設定詳細資料和
maxRetryCount
欄位。舉例來說,如要建立基本指令碼工作,指定失敗工作的重試次數上限,請建立含有下列內容的 JSON 檔案:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT }, "taskCount": 3 } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
將
MAX_RETRY_COUNT
改成每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於1
和10
之間的整數。如未指定maxRetryCount
欄位,預設值為0
,表示不重試任何工作。如要建立及執行作業,請使用
gcloud batch jobs submit
指令:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
更改下列內容:
JOB_NAME
:作業名稱。LOCATION
:工作地點。JSON_CONFIGURATION_FILE
:JSON 檔案的路徑,內含作業的設定詳細資料。
API
對 jobs.create
方法發出 POST
要求,並指定 maxRetryCount
欄位。
舉例來說,如要建立基本指令碼工作,並指定失敗工作的重試次數上限,請提出下列要求:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
更改下列內容:
針對部分失敗情況重試工作
您可以透過生命週期政策 (lifecyclePolicies[]
欄位),定義工作處理不同工作失敗情況的方式。
生命週期政策包含動作 (action
欄位)、動作條件 (actionCondition
欄位) 和結束代碼 (exitCodes[]
欄位)。
只要發生動作條件 (特定結束代碼),就會執行指定動作。您可以指定下列其中一項動作:
RETRY_TASK
:重試因exitCodes[]
欄位中指定的結束代碼而失敗的工作。如果工作失敗,且結束代碼未指定,系統就不會重試。FAIL_TASK
:請勿重試因exitCodes[]
欄位中指定的結束代碼而失敗的工作。如果工作失敗,且結束代碼未指定,系統會重試。
值得注意的是,如果工作失敗且未指定結束代碼,則會採取相反的動作,也就是重試部分結束代碼,並讓部分結束代碼失敗。因此,如要讓生命週期政策正常運作,您也需要定義自動重試次數上限 (maxRetryCount
欄位),允許工作自動重試失敗的工作至少一次。
每個結束代碼都代表特定失敗,由應用程式或 Batch 定義。結束碼 50001 到 59999 為保留碼,由 Batch 定義。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。
您可以使用 gcloud CLI 或 Batch API,指定工作在特定失敗後重試或失敗。
gcloud
建立 JSON 檔案,指定工作的設定詳細資料、
maxRetryCount
欄位和lifecyclePolicies[]
子欄位。如要建立基本指令碼工作,只針對某些結束代碼重試失敗的工作,請建立含有下列內容的 JSON 檔案:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ], "maxRetryCount": MAX_RETRY_COUNT, "lifecyclePolicies": [ { "action": "ACTION", "actionCondition": { "exitCodes": [EXIT_CODES] } } ] } } ], "logsPolicy": { "destination": "CLOUD_LOGGING" } }
更改下列內容:
MAX_RETRY_COUNT
:每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於1
和10
之間的整數。如未指定maxRetryCount
欄位,預設值為0
,表示不重試任何工作。ACTION
:您希望對失敗工作執行的動作,可以是RETRY_TASK
或FAIL_TASK
,這些工作會以指定的結束代碼失敗。如果工作失敗,且未指定結束代碼,則會採取其他動作。EXIT_CODES
:以逗號分隔的一或多個結束代碼清單,用來觸發指定動作,例如50001, 50002
。每個結束代碼都可以由應用程式或 Batch 定義。Batch 保留
50001
到59999
的結束代碼。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。
舉例來說,下列工作只會重試因先占 Spot VM 而失敗的工作。
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "sleep 30" } } ], "maxRetryCount": 3, "lifecyclePolicies": [ { "action": "RETRY_TASK", "actionCondition": { "exitCodes": [50001] } } ] } } ], "allocationPolicy": { "instances": [ { "policy": { "machineType": "e2-standard-4", "provisioningModel": "SPOT" } } ] } }
如要建立及執行作業,請使用
gcloud batch jobs submit
指令:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
更改下列內容:
JOB_NAME
:作業名稱。LOCATION
:工作地點。JSON_CONFIGURATION_FILE
:JSON 檔案的路徑,內含作業的設定詳細資料。
API
對 jobs.create
方法發出 POST
要求,指定 maxRetryCount
欄位和 lifecyclePolicies[]
子欄位。
如要建立基本指令碼工作,只針對某些結束代碼重試失敗的工作,請提出下列要求:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
],
"maxRetryCount": MAX_RETRY_COUNT,
"lifecyclePolicies": [
{
"action": "ACTION",
"actionCondition": {
"exitCodes": [EXIT_CODES]
}
}
]
}
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
更改下列內容:
PROJECT_ID
:專案的專案 ID。LOCATION
:工作地點。JOB_NAME
:作業名稱。MAX_RETRY_COUNT
:每個工作的重試次數上限。如要讓工作重試失敗的工作,這個值必須設為介於1
和10
之間的整數。如未指定maxRetryCount
欄位,預設值為0
,表示不重試任何工作。ACTION
:您希望對失敗工作執行的動作,可以是RETRY_TASK
或FAIL_TASK
,這些工作會以指定的結束代碼失敗。如果工作失敗,且未指定結束代碼,則會採取其他動作。EXIT_CODES
:以逗號分隔的一或多個結束代碼清單,用來觸發指定動作,例如50001, 50002
。每個結束代碼都可以由應用程式或 Batch 定義。Batch 保留
50001
到59999
的結束代碼。如要進一步瞭解保留的結束代碼,請參閱「疑難排解」一節。
舉例來說,下列工作只會重試因先占 Spot VM 而失敗的工作。
POST https://batch.googleapis.com/v1/projects/example-project/locations/us-central1/jobs?job_id=example-job
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 30"
}
}
],
"maxRetryCount": 3,
"lifecyclePolicies": [
{
"action": "RETRY_TASK",
"actionCondition": {
"exitCodes": [50001]
}
}
]
}
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"machineType": "e2-standard-4",
"provisioningModel": "SPOT"
}
}
]
}
}
根據重試次數修改工作行為
如要使用 BATCH_TASK_RETRY_ATTEMPT
預先定義的環境變數,請先按照本頁面先前章節的說明,為工作啟用自動重試功能,然後更新可執行檔。BATCH_TASK_RETRY_ATTEMPT
變數說明這項工作已嘗試的次數。如要讓工作根據重試次數採取不同行為,請在可執行檔中使用 BATCH_TASK_RETRY_ATTEMPT
變數。舉例來說,重試工作時,您可能想確認先前嘗試中已成功執行的指令。詳情請參閱「預先定義的環境變數」。