自动重试任务

本页面介绍在全部失败后自动重试任务的方法。 还是出现一些故障

Batch 作业至少有一个任务失败时,它可能就会失败 会由于各种原因而发生默认情况下,作业中的每个任务仅运行一次;如果 如果任务失败,则不会重试。不过,也有一些问题会导致任务 即可通过重试任务来轻松解决失败问题。在这些情况下 将作业配置为自动重试任务在很大程度上有助于 并缩短作业的总体运行时间

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

您可以在创建作业时为每个任务配置自动重试任务的功能。 具体而言,对于每项任务,您都可以使用以下某个 配置选项:

  • 默认情况下,每个任务失败时都不会重试。
  • 出现所有失败情况时重试任务:您可以 自动重试失败任务的最大次数。您 可以指定 0(默认值)到 10 次重试。
  • 在出现部分失败情况时重试任务: 你可以配置不同的任务 操作(自动重试或失败而不重试) 特定故障。对于所有未指定的失败情况,系统都会执行相反的操作。 具体的失败情况都可以通过退出代码来标识, 由应用或 Batch 定义。

准备工作

在所有失败后重试任务

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

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

请发送 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"
  }
}

替换以下内容:

  • 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 的退出代码由 批处理。有关保留的退出代码的详细信息,请参阅 问题排查

您可以为作业指定在特定失败后重试任务或使任务失败 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

      每个退出代码都可以由您的应用或 批处理。从 5000159999 的退出代码 为 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"
            }
          }
        ]
      }
    }
    
  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

请发送 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:最大数量 重试次数。为了让作业能够重试失败的任务, 此值必须设置为 110 之间的整数。 如果未指定 maxRetryCount 字段,则默认值为 0。 这意味着不重试任何任务。

  • ACTION:操作 RETRY_TASKFAIL_TASK,以用于以 指定的退出代码。因未指定的退出而失败的任务 会执行另一个操作。

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

    每个退出代码都可以由您的应用或 批处理。从 5000159999 的退出代码 为 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 变量(如果需要) 使任务行为因重试次数而异。 例如,当某个任务正在重试时,您可能需要 确认已在其中成功执行了哪些命令 。如需了解详情,请参阅 预定义的环境变量

后续步骤