使用超时限制任务和可运行对象的运行时间

本文档介绍了如何通过设置超时来限制任务和可运行对象的运行时间。或者,如果您希望可运行对象在其任务中的所有其他可运行对象都运行完毕后立即完成,请改用后台可运行对象

超时时间指定任务或可运行对象允许运行的时间量。Batch 不允许作业运行时间超过 14 天,也不会为各个任务和可运行对象设置默认超时时间。因此,单个任务或可运行对象在自动失败之前最多可以运行 14 天。但是,如果您的任务和可运行对象并非旨在运行这么长时间,此配置可能会导致意外的费用和延迟。为防止运行时间过长,您可以为任务和可运行对象设置超时。

准备工作

  1. 如果您之前未使用过 Batch,请查看开始使用 Batch 并完成项目和用户的前提条件,以启用 Batch。
  2. 如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

设置超时

您可以为可运行对象、任务或两者都设置超时。可运行对象的超时时间指定了相应可运行对象的最大运行时间。任务的超时时间指定了该任务的最长运行时间,即其所有可运行对象的各个运行时间之和。例如,如果某项任务有 3 个可运行对象,这些对象同时运行 1 分钟,则该任务的运行时间为 3 分钟,而非 1 分钟。

如果您设置了重叠的超时时间(例如,同时为可运行对象和可运行对象的任务设置了超时时间),则只需超过其中一个超时时间即可触发自动失败。例如,假设您将某项任务的超时时间设置为 60 秒,并将该任务的每个可运行对象的超时时间设置为 120 秒。然后,当其可运行对象的运行时间总和超过 60 秒时,此示例任务及其所有可运行对象都会失败,并且无法触发 120 秒的超时。

如需为作业的任务和可运行对象选择合适的超时时间,请分析您之前运行的类似作业的日志,以确定类似工作负载的任务和可运行对象的典型运行时间。

为任务设置超时时间

使用 Google Cloud CLI 或 REST API 创建作业,该作业在 JSON 文件的 taskSpec 对象中包含 maxRunDuration 字段

{
    "taskGroups": [
      {
        "taskSpec": {
          ...
          "maxRunDuration": "TIMEOUT"
        }
      }
    ]
}

TIMEOUT 替换为您希望允许任务运行的最大秒数或分数部分。例如 255s

如果作业将任务的超时时间设置为 255 秒,则其 JSON 配置文件应类似于以下内容:

{
    "taskGroups": [
      {
        "taskSpec": {
          "runnables": [
            {
              "script": {
                "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
              }
            }
          ],
          "maxRunDuration": "255s"
        },
        "taskCount": 3
      }
    ],
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

如果任务的超时时间被超出,该任务会自动失败,并且作业的状态事件和日志中会通过退出代码 50005 指示超时时间被超出。如需详细了解超时问题,请参阅有关退出代码 50005 的问题排查文档

为可运行对象设置超时时间

使用 Google Cloud CLI 或 REST API 创建作业,该作业在 JSON 文件的 runnable 对象中包含 timeout 字段

{
    "taskGroups": [
      {
        "taskSpec": {
          "runnables": [
            {
              ...
              "timeout": "TIMEOUT"
            }
          ]
        }
      }
    ]
}

TIMEOUT 替换为允许可运行对象运行的最大秒数或分数部分。例如 3.5s

如果作业为可运行对象设置了 3.5 秒的超时时间,则其 JSON 配置文件应类似于以下内容:

{
    "taskGroups": [
      {
        "taskSpec": {
          "runnables": [
            {
              "script": {
                "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
              },
              "timeout": "3.5s"
            }
          ]
        },
        "taskCount": 3
      }
    ],
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

如果可运行对象的超时时间已过,该可运行对象会自动失败,并且作业的状态事件和日志中会通过退出代码 50005 指示超时时间已过。如需详细了解超时问题,请参阅有关退出代码 50005 的问题排查文档

后续步骤