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