本文档介绍了如何在创建和运行批处理作业时配置自定义状态事件(用于描述作业的可运行作业)。如需了解状态事件,请参阅通过状态事件查看作业的历史记录。
借助自定义状态事件,您可以在任务历史记录中提供有关其可运行项进度的更多详细信息,这有助于更轻松地分析和排查作业问题。例如,您可以配置自定义状态事件,用于描述可运行对象的开始时间、结束时间、达到障碍可运行对象的时间,或代码运行期间发生的重要事件。
准备工作
- 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
作业的服务账号(默认是默认的 Compute Engine 服务账号)上的 Service Account User (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 Batch Job Editor (
配置自定义状态事件
在创建作业时,使用以下一项或多项选项配置自定义状态事件:
通过定义可运行项的显示名称来描述可运行项的状态。您可以在使用 gcloud CLI 或批处理 API 创建作业时执行此操作。
通过为每个事件编写包含
batch/custom/event
字段的有结构的任务日志,指明重要的运行时事件。您可以在使用任何方法创建作业时,在脚本和容器可运行项的定义中执行此操作。
描述可运行项的状态
您可以通过定义可运行项的显示名称(displayName
字段)来配置用于描述可运行项状态的自定义状态事件。生成的自定义状态事件因可运行项的类型而略有不同:
如果您为容器可运行作业或脚本可运行作业定义了显示名称,则批处理作业会自动添加两种类型的自定义状态事件。第一个自定义状态事件会指示任务何时启动此可运行对象。第二个自定义状态事件会指示任务何时完成此可运行对象以及相应的退出代码。
如果您为屏障可运行项定义了显示名称,则批处理会自动添加一个自定义状态事件,用于指示任务何时到达此屏障。
如需创建并运行包含描述可运行作业的状态的自定义状态事件的作业,请使用 gcloud CLI、Batch API 或库为一个或多个可运行作业定义 displayName
字段。
gcloud
使用 Google Cloud CLI 创建作业,在 JSON 文件中的一个或多个 runnables
定义中添加 displayName
字段:
...
"runnables": [
{
"displayName":DISPLAY_NAME,
...
}
]
...
例如,如果作业包含用于描述每个可运行作业的状态的自定义状态事件,则其 JSON 配置文件可能如下所示:
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"displayName":"DISPLAY_NAME1",
"script": {
"text": "echo Hello world from script 1 for task ${BATCH_TASK_INDEX}"
}
},
{
"displayName":"DISPLAY_NAME2",
"barrier": {}
},
{
"displayName":"DISPLAY_NAME3",
"script": {
"text": "echo Hello world from script 2 for task ${BATCH_TASK_INDEX}"
}
}
]
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
将 DISPLAY_NAME1
、DISPLAY_NAME2
和 DISPLAY_NAME3
替换为可运行项的名称,该名称必须在作业中保持唯一性,例如 script 1
、barrier 1
和 script 2
。
API
使用 REST API 创建作业,使其在 JSON 文件中的一个或多个 runnables
定义中包含 displayName
字段:
...
"runnables": [
{
"displayName":DISPLAY_NAME,
...
}
]
...
例如,如果作业包含用于描述每个可运行作业的状态的自定义状态事件,则其 JSON 配置文件可能如下所示:
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"displayName":"DISPLAY_NAME1",
"script": {
"text": "echo Hello world from script 1 for task ${BATCH_TASK_INDEX}"
}
},
{
"displayName":"DISPLAY_NAME2",
"barrier": {}
},
{
"displayName":"DISPLAY_NAME3",
"script": {
"text": "echo Hello world from script 2 for task ${BATCH_TASK_INDEX}"
}
}
]
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
将 DISPLAY_NAME1
、DISPLAY_NAME2
和 DISPLAY_NAME3
替换为可运行项的名称,该名称必须在作业中保持唯一性,例如 script 1
、barrier 1
和 script 2
。
Go
Java
Node.js
Python
示例作业运行完毕后,每项任务生成的自定义状态事件类似于以下内容:
statusEvents:
...
- description: 'script at index #0 with display name [DISPLAY_NAME1] started.'
eventTime: '...'
type: RUNNABLE_EVENT
- description: 'script at index #0 with display name [DISPLAY_NAME1] finished with exit
code 0.'
eventTime: '...'
type: RUNNABLE_EVENT
- description: 'barrier at index #2 with display name [DISPLAY_NAME2] reached.'
eventTime: '...'
type: BARRIER_REACHED_EVENT
- description: 'script at index #2 with display name [DISPLAY_NAME3] started.'
eventTime: '...'
type: RUNNABLE_EVENT
- description: 'script at index #2 with display name [DISPLAY_NAME3] finished with exit
code 0.'
eventTime: '...'
type: RUNNABLE_EVENT
...
指明重要的运行时事件
您可以配置自定义状态事件,以指明在运行某个可运行项时发生重要事件的时间。具体方法是,将该可运行项配置为写入结构化任务日志,为“批处理”自定义状态事件 (batch/custom/event
) 字段定义字符串。
如果容器可运行作业或脚本可运行作业写入定义 batch/custom/event
JSON 字段的结构化任务日志,则会在当时生成自定义状态事件。虽然您可以将结构化任务日志配置为包含其他字段,但自定义状态事件仅包含 batch/custom/event
字段的字符串。
如需创建和运行包含自定义状态事件的作业(用于指示重要事件何时发生),请将一个或多个可运行项配置为通过输出 JSON 写入结构化日志,并将 batch/custom/event
字段定义为日志的一部分。
...
"runnables": [
{
...
"echo '{\"batch/custom/event\":\"EVENT_DESCRIPTION\"}'"
...
}
]
...
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
...
例如,如果作业包含用于指示重要事件何时发生的自定义状态事件,则其 JSON 配置文件可能如下所示:
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 30; echo '{\"batch/custom/event\": \"EVENT_DESCRIPTION\"}'; sleep 30"
}
}
]
},
"taskCount": 3
}
],
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
将 EVENT_DESCRIPTION
替换为自定义状态事件的说明,例如 halfway done
。
示例作业运行完毕后,每项任务生成的自定义状态事件类似于以下内容:
statusEvents:
...
- description: EVENT_DESCRIPTION
eventTime: '...'
type: RUNNABLE_CUSTOM_EVENT
...