自动执行任务重试

本页面介绍了如何在全部或部分失败后自动重试任务。

当批量作业中至少有一个任务失败时,该作业就会失败,而造成这种情况的原因多种多样。默认情况下,作业中的每个任务仅运行一次;如果任务失败,则不会重试。不过,一些导致任务失败的问题只需重试任务即可轻松解决。在这些情况下,将作业配置为自动重试任务可以极大地帮助减少问题排查的不便并缩短作业的总运行时间。

自动重试非常适合松散耦合(独立)任务,可以帮助解决各种问题。例如,自动重试任务可以解决如下具有时效性的问题:

创建作业时,您可以为每项任务配置自动任务重试机制。 具体来说,对于每项任务,您可以使用以下配置选项之一:

  • 默认情况下,每个任务在失败时不会重试。
  • 在所有失败后重试任务:您可以配置自动重试失败任务的最大次数。您可以指定介于 0(默认值)到 10 次之间的重试次数。
  • 为某些失败情况重试任务:您可以针对特定失败情况配置不同的任务操作,包括自动重试或失败(不重试)。对于所有未指定的失败,将执行相反操作。具体失败可通过应用或 Batch 定义的退出代码来标识。

准备工作

在所有失败后重试任务

您可以使用 gcloud CLI 或 Batch API 为作业的失败任务定义自动重试次数上限(maxRetryCount 字段)

gcloud

  1. 创建一个 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 替换为每个任务的最大重试次数。为了让作业能够重试失败的任务,此值必须设置为 110 之间的整数。如果未指定 maxRetryCount 字段,则默认值为 0,表示不重试任何任务。

  2. 如需创建并运行作业,请使用 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"
  }
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID

  • LOCATION:作业的位置

  • JOB_NAME:作业的名称。

  • MAX_RETRY_COUNT:每个任务的最大重试次数。为了让作业能够重试失败的任务,此值必须设置为 110 之间的整数。如果未指定 maxRetryCount 字段,则默认值为 0,表示不重试任何任务。

针对某些失败情况重试任务

您可以使用生命周期政策(lifecyclePolicies[] 字段)定义作业处理不同任务失败的方式。

生命周期政策包含操作(action 字段)操作条件(actionCondition 字段)退出代码(exitCodes[] 字段)。每当发生操作条件(特定的退出代码)时,系统就会执行指定的操作。您可以指定以下某项操作:

  • RETRY_TASK:使用 exitCodes[] 字段中指定的退出代码失败的重试任务。如果任务失败并显示任何未指定的退出代码,则不会重试。
  • FAIL_TASK:不重试使用 exitCodes[] 字段中指定的退出代码失败的任务。如果任务失败,且有任何未指定的退出代码,系统会重试该任务。

值得注意的是,任何因未指定退出代码而失败的任务都会采取相反的操作:有些退出代码会重试,有些则会失败。因此,为使生命周期政策按预期运行,您还需要定义自动重试次数上限(maxRetryCount 字段),以允许作业自动重试失败的任务至少一次。

每个退出代码都表示一个由您的应用或 Batch 定义的特定失败。 50001 到 59999 之间的退出代码由 Batch 保留和定义。如需详细了解预留的退出代码,请参阅问题排查

您可以使用 gcloud CLI 或 Batch API 指定作业在特定失败后重试或失败任务。

gcloud

  1. 创建一个 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:每个任务的最大重试次数。为了让作业能够重试失败的任务,此值必须设置为 110 之间的整数。如果未指定 maxRetryCount 字段,则默认值为 0,表示不重试任何任务。

    • ACTION:您希望对因指定的退出代码而失败的任务执行的操作(RETRY_TASKFAIL_TASK)。因未指定退出代码而失败的任务会执行其他操作。

    • EXIT_CODES:要触发指定操作的一个或多个退出代码的逗号分隔列表,例如 50001, 50002

      每个退出代码都可以由您的应用或 Batch 定义。从 5000159999 的退出代码由 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"
            }
          }
        ]
      }
    }
    
  2. 如需创建并运行作业,请使用 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:每个任务的最大重试次数。为了让作业能够重试失败的任务,此值必须设置为 110 之间的整数。如果未指定 maxRetryCount 字段,则默认值为 0,表示不重试任何任务。

  • ACTION:您希望对因指定的退出代码而失败的任务执行的操作(RETRY_TASKFAIL_TASK)。因未指定退出代码而失败的任务会执行其他操作。

  • EXIT_CODES:要触发指定操作的一个或多个退出代码的逗号分隔列表,例如 50001, 50002

    每个退出代码都可以由您的应用或 Batch 定义。从 5000159999 的退出代码由 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 变量。例如,在重试任务时,您可能需要确认在上一次尝试中成功执行了哪些命令。如需了解详情,请参阅预定义环境变量

后续步骤