本页介绍了如何在所有或部分任务失败后自动重试任务。
如果批处理作业的至少一个任务失败,则该作业也会失败,失败的原因可能有很多。默认情况下,作业中的每个任务只会运行一次;如果任务失败,系统不会重试。不过,导致任务失败的一些问题只需重试任务即可轻松解决。在这些情况下,将作业配置为自动重试任务可以显著减少问题排查的阻碍,并缩短作业的总运行时间。
自动重试非常适合松散耦合的(独立)任务,并且有助于解决各种问题。例如,自动任务重试可以解决以下具有时效性的问题:
- Spot 虚拟机抢占
- 虚拟机维护事件和主机错误
- 暂时性网络连接错误
创建作业时,您可以为每个任务配置自动任务重试。具体而言,对于每个任务,您可以使用以下配置选项之一:
- 默认情况下,每个任务在失败时都不会重试。
- 针对所有失败任务重试:您可以配置自动重试失败任务的次数上限。您可以指定 0(默认值)到 10 次重试。
- 针对某些失败情况重试任务:您可以针对特定失败情况配置不同的任务操作(自动重试或失败而不重试)。对于所有未指定的失败,系统会执行相反的操作。每个特定失败都可以通过应用或批处理作业定义的退出代码进行标识。
准备工作
- 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
作业的服务账号(默认是默认的 Compute Engine 服务账号)上的 Service Account User (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 Batch Job Editor (
针对所有失败的任务重试
您可以使用 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
向指定 maxRetryCount
字段的 jobs.create
方法发出 POST
请求。
例如,如需创建一个基本脚本作业来指定失败任务的最大重试次数,请发出以下请求:
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
字段),以允许作业至少自动重试一次失败的任务。
每个退出代码都代表由您的应用或批处理定义的特定失败。50001 到 59999 之间的退出代码由批处理预留并定义。如需详细了解预留的退出代码,请参阅问题排查。
您可以使用 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
。每个退出代码都可以由您的应用或批处理作业定义。
50001
到59999
之间的退出代码由批处理预留。如需详细了解预留的退出代码,请参阅问题排查。
例如,以下作业仅会重试因 Spot 虚拟机抢占而失败的任务。
{ "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
。每个退出代码都可以由您的应用或批处理作业定义。
50001
到59999
之间的退出代码由批处理预留。如需详细了解预留的退出代码,请参阅问题排查。
例如,以下作业仅会重试因 Spot 虚拟机抢占而失败的任务。
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
变量。例如,在重试任务时,您可能需要确认之前的尝试中哪些命令已成功执行。如需了解详情,请参阅预定义环境变量。