本文档介绍了如何创建和运行使用实例灵活性的批量作业。借助实例灵活性,您可以允许作业在您指定且可选择性地进行排名的多种机器类型上运行。
通过为作业允许更多机器类型,您可以利用实例灵活性来提高可获取性,即有资源可用于运行作业的概率。如需详细了解如何为工作负载选择使用哪些可获取性功能,请参阅提高资源可获取性。 例如,使用实例灵活性可以帮助您执行以下操作:
准备工作
- 如果您之前未使用过 Batch,请查看开始使用 Batch,并完成项目和用户的前提条件以启用 Batch。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
- 项目的 Batch Job Editor (
roles/batch.jobsEditor) - 作业的服务账号(默认情况下为默认 Compute Engine 服务账号)的 Service Account User (
roles/iam.serviceAccountUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
- 项目的 Batch Job Editor (
限制
当作业使用实例灵活性时,需要遵守以下所有限制:
您允许作业使用的机器类型越多,可获取性就越高。
作业无法指定
FLEX_START预配模型或RESERVATION_BOUND预配模型。作业无法使用明确定向预留。(
reservation字段必须未定义或设置为NO_RESERVATION。)明确定向预留包括
RESERVATION_BOUND配置模型的所有预留,以及STANDARD配置模型的某些预留。这些功能本身是不兼容的,因为只有预留的机器类型才能成功创建实例。每个作业最多可以有 50 个实例选择。
作业中的每个实例选择都必须具有唯一的名称、唯一的等级以及一种或多种唯一的机器类型。
机器类型不得重复;每个作业的每个实例选择中只能包含一种机器类型。
每个作业在选择实例时最多可以选择 200 种不同的机器类型。
虽然在同一实例选择中指定多种机器类型是可选的,但如果您希望获得可用性更高的资源,则必须这样做。
- 仅当某个等级的实例选择有多种机器类型时,Batch 才会尝试选择一个或多个可获得性最高的机器类型。例如,如果您希望作业拥有不太可能被抢占的 Spot 虚拟机,或者希望作业拥有更多可并行运行任务的实例,那么此选择就非常重要。
- 否则,如果某个等级的实例选择仅包含一种机器类型,实例灵活性仅有助于防止资源可用性错误。
作业不得包含
machineType字段,并且系统会忽略作业指定的任何实例模板的机器类型。您必须验证为作业指定的每个属性是否与每个允许的机器类型兼容。否则,作业在提交后可能会因无法创建实例而失败。例如,我们建议您验证作业的至少以下属性是否与所有机器类型兼容:
- 位置(如果指定,则为
allowedLocations[]字段;否则为location) - 每个任务的计算资源(
computeResource字段) - 磁盘和映像(
volumes[]字段、disk[]字段和bootDisk字段) - network(
network字段) 所有其他实例属性(
instances[]子字段):- 满足最低要求的 CPU 平台(
minCpuPlatform字段) - 预配模型(
provisioningModel字段) - GPU(
accelerators[]字段)
- 满足最低要求的 CPU 平台(
- 位置(如果指定,则为
您无法为 Batch 作业替换磁盘和最低要求的 CPU 平台。所有机器类型都使用您指定的值(在
policy子字段或实例模板中),如果未指定,则使用最高优先级实例选择中机器类型的默认值。因此,我们建议您执行以下所有操作:验证启动磁盘类型是否与每种允许的机器类型兼容。总而言之,第 4 代及更高版本的机器类型不支持永久性磁盘,第 2 代及更低版本的机器类型不支持 Hyperdisk,第 3 代及更低版本的机器类型默认使用永久性启动磁盘。
除非您已验证每个允许的机器类型都支持最低要求 CPU 平台或可选磁盘,否则请勿指定它们。
创建允许使用多种机器类型的作业
如需创建允许使用多种机器类型的作业,请选择以下方法之一。
gcloud
如需在使用 Google Cloud CLI 创建作业时配置多种机器类型,请完成以下步骤:
在指定作业配置详细信息的 JSON 文件中,
allocationPolicy字段内包含instanceFlexibilityPolicy字段和子字段。instanceFlexibilityPolicy字段支持一个或多个实例选择,每个实例选择都有一个唯一的名称、一个唯一的排名以及一个包含一种或多种机器类型的列表。"allocationPolicy":{ "instanceFlexibilityPolicy":{ "instanceSelections":{ "INSTANCE_SELECTION_NAME":{ "rank": RANK, "machineTypes": [MACHINE_TYPES] } } } }替换以下内容:
INSTANCE_SELECTION_NAME:实例选择的名称。如果作业有多个实例选择,请确保此作业中的每个名称都是唯一的。RANK:可选:一个大于或等于零的整数,表示相应实例选择的优先级,其中值越低优先级越高。如果未指定,则默认值为0(最高优先级)。如果作业有多个实例选择,请确保此作业中的每个排名都是唯一的。MACHINE_TYPES:一个或多个机器类型的英文逗号分隔列表,以字符串形式表示,用于此实例选择。每个作业的实例选择中只能包含一次每种机器类型。例如,包含三种机器类型的列表可以写成如下形式:"MACHINE_TYPE_1", "MACHINE_TYPE_2", "MACHINE_TYPE_3"将
MACHINE_TYPE_1、MACHINE_TYPE_2、MACHINE_TYPE_3分别替换为机器类型,例如e2-micro、e2-small和n1-standard-2。
如需了解详情,另请参阅示例作业。
此功能目前为预览版,您必须使用
gcloud alpha batch jobs submit命令来创建和提交作业。gcloud alpha batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE替换以下内容:
JOB_NAME:作业的名称。LOCATION:作业的位置。JSON_CONFIGURATION_FILE:包含作业配置详情的 JSON 文件的路径。
REST
如需使用 Batch API 创建使用多种机器类型的作业,请在相应功能处于预览版阶段时使用 v1alpha jobs.create 方法。
如需为作业指定多个机器类型,请在 JSON 文件的主正文中的 allocationPolicy 字段中添加 instanceFlexibilityPolicy 字段和子字段。
instanceFlexibilityPolicy 字段支持一个或多个实例选择,每个实例选择都具有唯一的名称、唯一的排名以及一个或多个机器类型的列表。
"allocationPolicy":{
"instanceFlexibilityPolicy":{
"instanceSelections":{
"INSTANCE_SELECTION_NAME":{
"rank": RANK,
"machineTypes": [MACHINE_TYPES]
}
}
}
}
替换以下内容:
INSTANCE_SELECTION_NAME:实例选择的名称。如果作业有多个实例选择,请确保此作业中的每个名称都是唯一的。RANK(可选):一个大于等于零的整数,表示相应实例选择的优先级,值越小优先级越高。如果未指定,则默认值为0(最高优先级)。如果作业有多个实例选择,请确保此作业中的每个等级都是唯一的。MACHINE_TYPES:一个或多个机器类型的英文逗号分隔列表(以字符串形式表示),用于此实例选择。每个作业的实例选择中只能包含一次每种机器类型。例如,包含三种机器类型的列表可以写成如下形式:"MACHINE_TYPE_1", "MACHINE_TYPE_2", "MACHINE_TYPE_3"将
MACHINE_TYPE_1、MACHINE_TYPE_2、MACHINE_TYPE_3分别替换为机器类型,例如e2-micro、e2-small和n1-standard-2。
如需了解详情,另请参阅示例作业。
作业 JSON 配置文件示例
例如,在使用 gcloud CLI 或 Batch API 时,您可以使用以下 JSON 配置文件来创建具有两个实例选择的基本脚本作业:
- 名为
first-choice的实例选择具有最高优先级 ("rank": 0) 和三种机器类型(e2-micro、e2-small和n1-standard-2)。 - 名为
second-choice的实例选择具有第二优先级 ("rank": 1) 和一种机器类型 (e2-medium)。
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello World! This is task $BATCH_TASK_INDEX."
}
}
]
},
"taskCount": 3
}
],
"allocationPolicy":{
"instanceFlexibilityPolicy":{
"instanceSelections":{
"first-choice":{
"rank": 0,
"machineTypes": ["e2-micro", "e2-small", "n1-standard-2"]
},
"second-choice":{
"rank": 1,
"machineTypes": ["e2-medium"]
}
}
}
}
}