本文档介绍了作业的执行流程和创建选项。 借助批处理作业,您可以在Google Cloud上运行批处理工作负载。如需了解作业的组成部分以及使用 Batch 的前提条件,请参阅 Batch 使用入门。
作业创建和执行的工作原理
如需使用 Batch,您需要创建一个作业来指定工作负载及其要求,然后 Batch 会自动运行该作业。
以下部分介绍了作业创建和执行的工作原理:
Job 生命周期
本部分介绍了作业及其任务从创建到删除的生命周期。
对于您希望在批处理作业中运行的每个工作负载,您都需要完成以下基本流程:
- 创建作业:您可以通过指定作业的可运行项、任务和任何其他要求来定义要运行的工作负载。如需详细了解如何创建作业,请参阅本文档中的作业创建选项部分。
- 监控和排查作业问题:创建作业后,系统会自动将作业加入队列、安排作业时间并在指定资源上执行作业。您可以查看已创建作业或其任何任务的详细信息,以了解当前状态。如有需要,您可以取消作业(预览)以停止或阻止其运行。作业运行或完成后,您还可以使用日志监控和分析作业。如果作业失败,您可以在重新创建作业之前,使用任何错误消息、状态事件或日志来诊断问题。
- 删除或导出作业:在您或 Google Cloud 删除作业之前,作业在批量处理中的相关信息会一直可用。Google Cloud 会在作业完成 60 天后自动删除该作业。在此之前,您可以选择自行删除作业;如果您需要保留相关信息,则可以在作业被删除之前批量导出作业信息。删除作业后,存储在其他服务中的作业相关信息不会受到影响,并且这些信息有单独的保留政策。 Google Cloud 例如,作业的日志会根据 Cloud Logging 保留政策自动保留和删除。
创建作业后,作业会经历以下状态:
- 已加入队列 (
QUEUED
):作业请求已被接受,正在队列中等待。该作业会一直留在队列中,直到所需资源可用且排在其前面的作业均已评估完毕。 - 已安排 (
SCHEDULED
):系统已从队列中选择该作业以开始运行,并且正在分配资源。 正在运行 (
RUNNING
):作业的资源已成功创建,其任务可以开始运行。作业运行时,其每个任务都会经历以下状态:
- 待处理 (
PENDING
):任务正在等待在虚拟机上运行。 - 已分配 (
ASSIGNED
):系统已为任务分配了运行环境。 - 正在运行 (
RUNNING
):任务正在虚拟机上运行。 任务会在以下状态之一下完成:
成功 (
SUCCEEDED
):任务成功,因为其每个可运行项都满足以下条件之一:- 可运行程序成功(返回了零的退出代码)。
- 可运行项失败(返回非零退出代码),但属于非关键可运行项(您已启用可运行项的
ignoreExitStatus
字段)。 - 可运行对象未完成,但它是后台可运行对象(您启用了可运行对象的
background
字段)。
失败 (
FAILED
):由于至少有一个可运行项不满足上述条件,因此任务失败并停止运行。
系统会在作业完成之前删除作业的资源。
- 待处理 (
作业会在以下任一状态下完成:
作业队列和调度
通常,作业越小且只需要少量常用资源,就越有可能更快地运行和完成。对于“批处理”文档中的示例作业(通常非常小且使用极少的资源),您可能会发现它们只需几分钟即可运行完毕。
具体而言,作业完成排队和调度所需的时间因作业而异,并且在不同时间也会因以下因素而异:
用户指定的作业前提条件:您要求在安排作业之前必须满足的所有前提条件。
默认情况下,作业没有任何前提条件。(可选)您可以指定,在一个或多个现有作业成功或失败之前,系统无法安排作业。如需了解详情,请参阅安排依赖作业(预览版)。
作业优先级:相对于项目中其他作业的优先级而言,作业的优先级。
您可以选择通过添加 gcloud CLI 的
--priority
标志或priority
JSON 字段来指定作业的优先级。您可以将作业的优先级定义为介于0
(最低优先级)和99
(最高优先级)之间的数字。设置较高的优先级有助于作业比项目中优先级较低的作业更早运行。如果您未配置作业的优先级,则系统会默认使用最低优先级
0
。如果两个队列作业具有相同的优先级,则优先级较高的是先创建的作业。作业资源可用性:作业所需资源在允许的位置的可用性。
首先,如果您指定的资源未在该位置提供,作业将无法运行。在这种情况下,作业会失败并出现区域可用性错误。
其次,如果作业的任何所需资源因资源可用性错误而相对于当前需求的容量较低,则作业更有可能延迟或失败。因此,如果您需要的资源更少、更常见,并且不限制作业在某个区域中的任何可用可用区运行,您的作业可能会更快运行。
如需详细了解作业的资源,请参阅本文档中的作业执行部分。如需详细了解您可以为批处理作业及其资源指定的位置,请参阅位置页面。
配额和限制:您的项目对 Google Cloud 资源和请求设置的阈值。
如果作业超出任何所需资源或请求的限制或项目配额,则无法运行。在这种情况下,批处理作业可能会延迟作业并稍后重试,或者使作业失败并显示相关错误。
您可以创建符合所有相关限制的作业,并确保您的项目有足够的相关配额,以帮助防止作业出现延迟和错误。如需了解详情,请参阅批量配额和限制。
作业执行
作业的执行时间可能会因任务调度和作业的资源而异。
任务调度
作业运行时,其任务会根据调度政策 (schedulingPolicy
) 字段进行调度,您可以通过该字段指定以下选项之一:
- 尽快 (
AS_SOON_AS_POSSIBLE
)(默认):任务会在资源可用后立即运行,并且可以并行运行。一次运行的任务数量取决于作业的资源和其他配置选项允许的每个虚拟机的并行任务数量,如本文档中的作业资源部分所述。 - 按顺序 (
IN_ORDER
):任务按编号顺序依次运行。
作业资源
每个 Batch 作业都将在区域级代管式实例组 (MIG) 上运行,该组由一个或多个匹配的 Compute Engine 虚拟机 (VM) 实例组成,每个实例都位于所包含的某个区域中。每个虚拟机都具有专用于 CPU 核心(具体为虚拟 CPU [vCPU])和内存的硬件(这两者会影响作业的性能),以及用于存储操作系统 (OS) 映像和用于运行作业的指令的启动磁盘。
在作业运行期间,Batch 会自动创建和删除符合您规范的资源。创建作业时,您可以通过指定以下内容来配置其资源:
每项任务的计算资源:除非默认值足够,否则您必须指定每项任务运行所需的计算资源(vCPU、内存和(如果需要)额外的启动磁盘存储空间)。如需了解详情,请参阅每个任务的计算资源 (
computeResource
) 字段。虚拟机资源:您还可以视需要使用虚拟机资源政策 (
instances[].policy
) 字段或替代instances[].instanceTemplate
字段,指定作业的虚拟机(例如机器类型和操作系统)以及 GPU 和存储卷等其他资源。如果您将这些字段留空(使用 Google Cloud 控制台创建作业时无法执行此操作),批处理作业会自动尝试选择兼容的虚拟机,而不会添加任何其他资源。
虚拟机数量以及每个虚拟机上可以同时运行的任务数量因作业而异,具体取决于任务调度和您指定的硬件要求。如果您为作业的任务指定运行 IN_ORDER
,则作业有一个虚拟机,并且一次只能运行一个任务。否则,如果作业的任务运行 AS_SOON_AS_POSSIBLE
,则您可以使用以下公式估算虚拟机数量和同时运行的任务数量:
\[{vmsPerJob}=\frac{taskCount}{parallelTasksPerVm}\]
此公式的值如下:
- \({vmsPerJob}\):作业的虚拟机数量上限。为作业创建的实际虚拟机数量可能会少于此数值。例如,如果 Batch 预计使用较少资源运行作业比等待更多资源更快,此值还受每个作业的并发虚拟机数限制的约束。
- \({taskCount}\):作业的任务总数,您可以使用任务数 (
taskCount
) 字段进行定义。 \({parallelTasksPerVM}\):虚拟机上可以同时运行的任务数量上限。
此值由以下所有条件决定:
最小值为 1 个任务。
最大值是 20 个任务和(如果已定义)“每个作业的并行任务数上限 (
parallelism
)”字段的值中的较小者。如果定义了每个虚拟机的并发任务数上限 (
taskCountPerNode
) 字段,则使用该值。否则,如果
taskCountPerNode
未定义,Batch 会通过将每个虚拟机的计算资源总数(具体为 vCPU 数量)除以每个任务所需的数量来确定值:\[{parallelTasksPerVm}=\frac{vcpusPerVm}{vcpusPerTask}\]
此公式的值如下:
\({vcpusPerVm}\):每个虚拟机的 vCPU 总数,由作业虚拟机的机器类型决定。
\({vcpusPerTask}\):每个任务的 vCPU 数量,通过转换每个任务的 vCPU 数量 (
cpuMilli
) 字段的单位来确定。
作业创建选项
创建和运行基本作业介绍了基本知识,包括如何使用脚本或容器映像定义可运行作业,以及如何配置预定义和自定义环境变量。
了解作业创建的基础知识后,不妨考虑创建一个使用以下一个或多个额外配置选项的作业:
控制作业的访问权限:
使用自定义服务账号控制作业的访问权限介绍了如何指定作业的服务账号,该账号会影响作业的虚拟机可以访问的资源和应用。如果您未指定自定义服务账号,则作业会默认使用 Compute Engine 默认服务账号。
网络概览简要介绍了何时以及如何自定义作业的网络配置,包括指定作业的网络、屏蔽外部连接,以及使用 VPC Service Controls 保护数据和资源。
使用 Secret Manager 保护敏感数据介绍了如何在创建作业时使用 Secret Manager Secret 指定加密信息,以安全地定义敏感数据(例如自定义环境变量和登录凭据)。
为作业配置其他选项:
使用 MPI 库配置任务通信介绍了如何使用消息传递接口 (MPI) 库配置包含相互依赖的任务的作业,这些任务会在不同的虚拟机之间相互通信。MPI 的一个常见用例是紧密耦合的高性能计算 (HPC) 工作负载。
自定义作业运行的资源:
使用虚拟机实例模板定义作业资源介绍了如何在创建作业时指定 Compute Engine 虚拟机模板来定义作业的资源。这是一种使用
instances[].policy
字段直接指定作业资源的替代方法。为作业使用 GPU介绍了如何定义使用一个或多个图形处理单元 (GPU) 的作业。使用 GPU 的作业的常见用例包括密集型数据处理或机器学习 (ML) 工作负载。
为作业使用存储卷介绍了如何定义可访问一个或多个外部存储卷的作业。存储方案包括新的或现有的永久性磁盘、新的本地 SSD、现有的 Cloud Storage 存储分区,以及现有的网络文件系统 (NFS),例如 Filestore 文件共享。
虚拟机操作系统环境概览简要介绍了何时以及如何为作业自定义虚拟机操作系统 (OS) 环境,包括作业的虚拟机操作系统映像和启动磁盘。
优化作业的各个方面:
改进监控和分析:
写入任务日志介绍了如何配置作业的可运行项以写入任务日志。通过写入任务日志,您可以在 Cloud Logging 中显示自定义信息,这有助于更轻松地分析和排查作业问题。
配置自定义状态事件介绍了如何为作业的可运行项配置自定义状态事件。借助自定义状态事件,您可以描述可运行作业发生的重要事件,这些事件会在您查看作业的状态事件历史记录时显示,有助于您更轻松地分析和排查作业问题。
启用状态通知介绍了如何配置作业以发送有关其状态的 Pub/Sub 通知,您可以选择在 BigQuery 表中存储和查询这些通知。在阅读本文档之前,请先配置您的项目以使用 Pub/Sub 通知和 BigQuery 监控作业状态。
启用 Ops Agent 指标介绍了如何配置作业以自动安装 Ops Agent。Ops Agent 会收集有关作业资源性能和利用率的其他指标。如需详细了解如何查看和使用资源指标,请参阅通过查看指标监控和优化作业资源。
安排依赖作业(预览版)介绍了如何指定在一个或多个现有依赖作业成功或失败之前不运行的作业。如果您的工作负载具有不同的资源要求,您可以将用于低需求操作(例如数据准备)和计算密集型操作(例如数据处理)的虚拟机类型分开,从而降低费用和配额用量。
自动重试任务介绍了如何在所有或指定的失败后自动重试作业的任务。自动重试有助于减少问题排查的摩擦,并缩短出现临时错误的作业所需的总运行时间。例如,针对在 Spot 虚拟机上运行的作业使用自动重试。Spot 虚拟机可提供大幅折扣,但可能并不总是可用,并且可随时被抢占。
使用超时限制运行时间介绍了如何限制任务或可运行对象的运行时长。通过防止运行时间过长,您可以减少意外费用和延迟。
使用虚拟机预留确保资源可用性介绍了如何配置可在预留的虚拟机上运行的作业。使用预留虚拟机有助于您最大限度地缩短作业的调度时间、防止出现资源可用性错误,并优化费用。
缩短延迟时间:
将虚拟机并置以缩短延迟时间介绍了如何要求虚拟机在物理上彼此靠近,从而缩短作业虚拟机之间的网络延迟时间。对于需要频繁在虚拟机之间进行网络通信的作业(例如使用 MPI 库进行通信的任务),这种性能优势尤为有用。
使用映像流式传输介绍了如何通过从 Artifact Registry 流式传输容器映像来缩短作业启动时间。
使用其他服务创建和运行作业:
使用 Workflows 编排作业介绍了如何使用 Workflows 按照您使用 Workflows 语法定义的顺序执行作业的任务。
使用 Nextflow 编排作业介绍了如何通过 Nextflow 流水线运行 Batch 作业,该流水线可用于编排生物信息学工作流。
使用 dsub 编排作业介绍了如何通过
dsub
流水线运行 Batch 作业,该流水线可用于在 Google Cloud 服务上编排批量处理工作流。使用 Terraform 和 Cloud Scheduler 创建和运行批处理作业介绍了如何将批处理作业纳入 Terraform。借助 Terraform,您可以在配置文件中指定首选状态(可视为代码并存储在 GitHub 等版本控制系统中),以便预配和管理基础架构。