本页面介绍在全部失败后自动重试任务的方法。 还是出现一些故障
Batch 作业至少有一个任务失败时,它可能就会失败 会由于各种原因而发生默认情况下,作业中的每个任务仅运行一次;如果 如果任务失败,则不会重试。不过,也有一些问题会导致任务 即可通过重试任务来轻松解决失败问题。在这些情况下 将作业配置为自动重试任务在很大程度上有助于 并缩短作业的总体运行时间
自动重试非常适合 松散耦合(独立)任务 并帮助解决各种问题例如,自动重试任务 可以解决以下具有时效性的问题:
- Spot 虚拟机的抢占
- 虚拟机维护事件和主机错误
- 暂时性网络连接错误
您可以在创建作业时为每个任务配置自动重试任务的功能。 具体而言,对于每项任务,您都可以使用以下某个 配置选项:
- 默认情况下,每个任务失败时都不会重试。
- 出现所有失败情况时重试任务:您可以 自动重试失败任务的最大次数。您 可以指定 0(默认值)到 10 次重试。
- 在出现部分失败情况时重试任务: 你可以配置不同的任务 操作(自动重试或失败而不重试) 特定故障。对于所有未指定的失败情况,系统都会执行相反的操作。 具体的失败情况都可以通过退出代码来标识, 由应用或 Batch 定义。
准备工作
- 如果您以前没有使用过 Batch,请参阅 Batch 使用入门 并通过填写 针对项目和用户的前提条件。
-
如需获取创建作业所需的权限, 请让管理员授予您 以下 IAM 角色:
-
Batch Job Editor (
roles/batch.jobsEditor
) 针对项目 -
Service Account User (
roles/iam.serviceAccountUser
) 服务账号用户 针对作业的服务账号,该账号默认为默认 Compute Engine 服务账号
如需详细了解如何授予角色,请参阅管理访问权限。
-
Batch Job Editor (
在所有失败后重试任务
您可以定义
自动重试次数上限(maxRetryCount
字段)
使用 gcloud CLI 或 Batch API 监控作业中失败的任务。
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
请发送 POST
请求至
jobs.create
方法
指定 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 的退出代码由 批处理。有关保留的退出代码的详细信息,请参阅 问题排查。
您可以为作业指定在特定失败后重试任务或使任务失败 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
的退出代码 为 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
请发送 POST
请求至
jobs.create
方法
,用于指定 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
的退出代码 为 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"
}
}
]
}
}
根据重试次数修改任务行为
(可选)在为任务启用自动重试功能后
如本页前几部分所述,您可以
更新 Runnable 以使用
BATCH_TASK_RETRY_ATTEMPT
预定义环境变量。
BATCH_TASK_RETRY_ATTEMPT
变量描述的是
已尝试过此任务。使用
BATCH_TASK_RETRY_ATTEMPT
变量(如果需要)
使任务行为因重试次数而异。
例如,当某个任务正在重试时,您可能需要
确认已在其中成功执行了哪些命令
。如需了解详情,请参阅
预定义的环境变量。