本文档介绍如何创建在预留资源上运行的作业。
预留是 Compute Engine 的一项功能。预留在获取具有指定硬件配置的一个或多个虚拟机的容量方面提供了非常高的保证。虚拟机的预留从您创建虚拟机到您删除预留,一直会产生该虚拟机的费用。但是,当您使用该虚拟机时,总费用与无需预留的虚拟机相等。
通常,当容量可用性至关重要或者防止获取资源时出错时,预留非常有用。具体而言,对于 Batch,请考虑使用专用预留来帮助最大限度地缩短作业调度时间,或尝试在未使用的现有预留时使用。 如果您的预留利用率过低(例如承诺使用折扣所需的预留),则可以将作业配置为在尚未使用它们时尝试使用它们,以尝试帮助优化产生的费用。
如需详细了解预留,请参阅有关预留的 Compute Engine 文档。
准备工作
- 如果您之前未使用过 Batch,请查看 Batch 使用入门,并在满足项目和用户的前提条件以启用 Batch。
- 确保您有权创建预留或查看希望作业的虚拟机根据需要使用的现有预留。
-
如需获取创建作业所需的权限,请让管理员授予您以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
对作业的服务帐号拥有的 Service Account User (
roles/iam.serviceAccountUser
),默认为默认的 Compute Engine 服务帐号
如需详细了解如何授予角色,请参阅管理访问权限。
-
项目的 Batch Job Editor (
限制
除了针对预留的一般限制之外,Batch 还具有以下限制:
- 作业的虚拟机无法使用共享预留。
- 如果作业的虚拟机指定了紧凑布置政策,则其无法使用预留。
使用要求
本部分总结了作业的虚拟机使用预留的要求。如需详细了解所有要求,请参阅 Compute Engine 文档中的预留常规要求以及本文档后面的规划配置的过程。
作业的虚拟机通常能够使用预留,必须满足以下所有条件:
该作业和预留必须指定完全匹配的虚拟机属性。
您必须遵守本文档中的所有限制以及预留的所有其他一般要求。
为使作业的每个虚拟机成功使用预留,预留必须在虚拟机运行期间具有未使用的容量。
预留的未用容量是指其虚拟机数量与当前使用该预留的虚拟机数量之间的差值。只要您有未使用的预留容量,虚拟机就会尝试使用预留。因此,虚拟机可以在创建时或运行后开始使用预留。虚拟机停止运行或预留被删除之前,不会停止使用预留。
根据未使用的预留容量总量,作业的任何虚拟机、部分或全部虚拟机都可能会使用预留,并且在整个作业运行期间,预留虚拟机的数量可能会有所不同。
创建并运行可以使用预留虚拟机的作业
规划您的配置。 为了确保您的作业与预留兼容,请完成以下步骤。
如果要使用已存在的预留,则必须创建具有相应配置的作业。否则,如果您打算创建新预留,请选择所需的配置选项。
确定预留属性。由于这些限制,共享类型必须是single-project,这是预留的默认选项。确定要用于以下预留属性的值:
- 用量类型*
- 虚拟机数量†
确定作业和预留的虚拟机属性。 由于存在限制,作业和预留都不能指定紧凑布置政策,这是预留和作业的默认选项。确定要用于以下虚拟机属性的值,这些值必须与预留和作业完全匹配:
- 项目
- 可用区*
- 机器类型†
- 满足最低要求的 CPU 平台†(如果有)‡)
- GPU 类型和数量†(如果有‡)
- 本地 SSD 类型和数量†(如果有)‡)
- 预订型广告系列的兴趣相似的受众群体†#
*作业虚拟机必须与预留虚拟机位于同一可用区。您必须在作业的
allowedLocations[]
字段中添加此地区;如果省略allowedLocations[]
字段,请将作业的位置设置为包含此地区的区域。†该作业必须使用
policy
子字段或虚拟机实例模板定义所有这些属性。作业无法指定policy
子字段和模板的组合。‡ 不能为一种资源定义选填字段,而另一种资源会忽略该字段。为预留和作业定义或省略可选字段。如果作业指定了虚拟机实例模板,这也适用于指定模板的字段。
#预留的使用类型决定了作业的虚拟机所需的预留亲和性,您必须按如下方式在作业中指定此亲和性:
- 如果作业使用的是虚拟机实例模板,则该模板需要按照预留文档中的说明配置预留相似性。
- 如果作业未使用模板,并且预留有针对性,请在作业的
reservation
字段中指定预留的名称。 - 否则,如果作业未使用模板,并且系统会自动使用预留,请省略作业的
reservation
字段。
准备预留。如果您还没有创建希望作业虚拟机使用的预留,请先创建。请确保预留具有您计划的属性。
创建并运行作业。您可以使用 gcloud CLI 或 Batch API 创建和运行使用准备好预留中的虚拟机的作业:
gcloud
创建一个 JSON 文件,其中指定作业的配置详细信息,以便将虚拟机实例资源 (
instances[]
) 子字段设置为与预留的虚拟机属性完全匹配。例如,如需创建一个使用预留中的虚拟机的基本脚本作业,请创建一个包含以下内容的 JSON 文件:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
通过指定您在前面步骤中计划的
instances[]
子字段,将VM_RESOURCES
替换为与作业要使用的预留相匹配的虚拟机资源。例如,从
VM_RESOURCES
的以下值开始:"installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }
如需使用此值,请进行以下所有更改:
是否要使用实例模板?
是:将
policy
字段替换为instanceTemplate
字段,并指定与预留匹配的现有虚拟机实例模板。如需查看示例,请参阅使用虚拟机实例模板的代码示例。如果预留使用 GPU 或本地 SSD,您还需要分别配置作业的installGpuDrivers
字段和volumes[]
字段。否则,请跳过其余更改。否:将
MACHINE_TYPE
替换为与预留相同的机器类型。
预留是否包含满足最低要求的 CPU 平台?
是:将
MIN_CPU_PLATFORM
替换为相同的满足最低要求的 CPU 平台。否:移除
minCpuPlatform
字段。
预留是否包含 GPU?
是:替换
INSTALL_GPU_DRIVERS
、GPU_TYPE
和GPU_COUNT
以匹配预留。如需查看示例,请参阅使用 GPU 的代码示例。否:移除
installGpuDrivers
字段和accelerators[]
字段。
此预留是否包含本地 SSD?
是:替换
LOCAL_SSD_SIZE
和LOCAL_SSD_NAME
以匹配预留,并通过向作业添加volumes[]
字段来装载本地 SSD。如需查看示例,请参阅使用本地 SSD 的代码示例。否:移除
disks[]
字段。
预留是否使用了专门定位的使用类型?
是:将
SPECIFIC_RESERVATION_NAME
替换为预留的名称。否:移除
reservation
字段。
例如,假设您正在为
n2-standard-32
虚拟机使用自动使用的预留,但该虚拟机未指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD。此外,您也不希望指定虚拟机实例模板。在这种情况下,您必须将VM_RESOURCES
替换为以下值:"policy": { "machineType": "n2-standard-32" }
如需创建并运行作业,请使用
gcloud batch jobs submit
命令:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
替换以下内容:
JOB_NAME
:作业的名称。LOCATION
:作业的位置。除非作业指定allowedLocations[]
字段,否则该字段必须是包含预留可用区的区域。JSON_CONFIGURATION_FILE
:包含作业配置详细信息的 JSON 文件的路径。
API
向
jobs.create
方法发出POST
请求,该方法会将虚拟机实例资源 (instances[]
) 子字段设置为完全匹配预留的虚拟机属性。例如,如需创建一个使用预留中的虚拟机的基本脚本作业,请发出以下请求:
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}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
替换以下内容:
PROJECT_ID
:您的项目 ID。LOCATION
:作业的位置。除非作业指定allowedLocations[]
字段,否则该字段必须是包含预留可用区的区域。JOB_NAME
:作业的名称。VM_RESOURCES
:通过指定您在前面步骤中计划的instances[]
子字段,与作业要使用的预留匹配的虚拟机资源。例如,从
VM_RESOURCES
的以下值开始:"installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }
如需使用此值,请进行以下所有更改:
是否要使用实例模板?
是:将
policy
字段替换为instanceTemplate
字段,并指定与预留匹配的现有虚拟机实例模板。如需查看示例,请参阅使用虚拟机实例模板的代码示例。如果预留使用 GPU 或本地 SSD,您还需要分别配置作业的installGpuDrivers
字段和volumes[]
字段。否则,请跳过其余更改。否:将
MACHINE_TYPE
替换为与预留相同的机器类型。
预留是否包含满足最低要求的 CPU 平台?
是:将
MIN_CPU_PLATFORM
替换为相同的满足最低要求的 CPU 平台。否:移除
minCpuPlatform
字段。
预留是否包含 GPU?
是:替换
INSTALL_GPU_DRIVERS
、GPU_TYPE
和GPU_COUNT
以匹配预留。如需查看示例,请参阅使用 GPU 的代码示例。否:移除
installGpuDrivers
字段和accelerators[]
字段。
此预留是否包含本地 SSD?
是:替换
LOCAL_SSD_SIZE
和LOCAL_SSD_NAME
以匹配预留,并通过向作业添加volumes[]
字段来装载本地 SSD。如需查看示例,请参阅使用本地 SSD 的代码示例。否:移除
disks[]
字段。
预留是否使用了专门定位的使用类型?
是:将
SPECIFIC_RESERVATION_NAME
替换为预留的名称。否:移除
reservation
字段。
例如,假设您正在为
n2-standard-32
虚拟机使用自动使用的预留,但该虚拟机未指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD。此外,您也不希望指定虚拟机实例模板。在这种情况下,您必须将VM_RESOURCES
替换为以下值:"policy": { "machineType": "n2-standard-32" }