本页介绍了如何在所有或部分失败后自动重试任务。
当 Batch 作业的至少一个任务失败时,该作业也会失败,而任务失败的原因可能有很多。默认情况下,作业中的每个任务仅运行一次;如果任务失败,系统不会重试。不过,有些导致任务失败的问题只需重试任务即可轻松解决。在这些情况下,将作业配置为自动重试任务可以大幅减少问题排查摩擦,并缩短作业的总体运行时间。
自动重试非常适合松散耦合(独立)的任务,有助于解决各种问题。例如,自动重试任务可以解决以下时间敏感型问题:
- Spot 虚拟机的抢占
- 虚拟机维护事件和主机错误
- 暂时性网络连接错误
您可以在创建作业时为每个任务配置自动重试。具体而言,对于每个任务,您可以使用以下配置选项之一:
- 默认情况下,每个任务在失败时都不会重试。
- 针对所有失败重试任务:您可以配置自动重试失败任务的最大次数。您可以指定 0(默认值)到 10 次重试。
- 针对某些失败重试任务:您可以针对特定失败配置不同的任务操作,包括自动重试或不重试直接失败。对于所有未指定的失败,系统会采取相反的操作。 每种特定故障都可以通过应用或 Batch 定义的退出代码来识别。
准备工作
- 如果您之前未使用过 Batch,请查看开始使用 Batch 并完成项目和用户的前提条件,以启用 Batch。
- 
  
  
  
  
  
  
  
    
    
    
    
    
    
      
      
        
        
        
        
        
      
    
      
      
        
        
        
        
        
      
    
    
    
    
    
  
  如需获得创建作业所需的权限,请让您的管理员为您授予以下 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
向 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 定义。从 - 50001到- 59999的退出代码由 Batch 保留。 如需详细了解预留的退出代码,请参阅问题排查。
 - 例如,以下作业仅重试因 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。- 每个退出代码都可以由您的应用或 Batch 定义。从 - 50001到- 59999的退出代码由 Batch 保留。 如需详细了解预留的退出代码,请参阅问题排查。
例如,以下作业仅重试因 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 变量。例如,在重试任务时,您可能需要确认在上一次尝试中哪些命令已成功执行。如需了解详情,请参阅预定义的环境变量。