灵活虚拟机是 Managed Service for Apache Spark 的一项功能,可让您指定 优先级的 虚拟机类型 列表,以便在您 创建 Managed Service for Apache Spark 集群时用于 Managed Service for Apache Spark 主节点、主要工作器节点和辅助工作器节点。
为什么要使用灵活的虚拟机?
问题:如果您在提交集群创建请求时,某个虚拟机类型不可用,则请求会失败,您需要更新请求、脚本或代码,以指定“次优”虚拟机类型。此重新请求过程可能涉及多次迭代,直到您指定可用的虚拟机类型为止。
解决方案:Managed Service for Apache Spark 灵活虚拟机功能可帮助您成功发出集群创建请求,方法是从排名的虚拟机列表中选择主节点、主要工作器虚拟机和辅助工作器虚拟机类型,然后在指定集群区域内搜索列出的虚拟机类型可用的可用区。
限制
- 使用灵活虚拟机的集群无法 停止。
- 高可用性集群中的主节点不能使用灵活虚拟机,但 HA 集群工作器节点可以使用灵活虚拟机。
术语
- 虚拟机类型 :虚拟机实例的系列、内存容量和 CPU 核心数。Managed Service for Apache Spark 支持使用 预定义和自定义虚拟机类型。
- 主节点和主工作节点 :默认情况下,Managed Service for Apache Spark 集群有一个主节点和两个主工作节点。
- 辅助工作器节点:辅助工作器 不存储数据,仅充当处理节点。 您可以使用辅助工作器来伸缩计算,而无需伸缩存储。默认的灵活虚拟机辅助工作器类型是 Spot 虚拟机,这是一种抢占式类型。
用法
- 灵活虚拟机在 Managed Service for Apache Spark
Managed Service for Apache Spark
2.0.74+、2.1.76+、2.2.42+及更高版本映像 的 Managed Service for Apache Spark 中提供。 *。从映像版本3.0开始,如果您在创建集群时未为集群节点指定机器类型,Managed Service for Apache Spark 会为该节点指定一个排名的灵活虚拟机机器类型列表,例如 N4、N2 和 E2 系列机器类型的排名列表,该列表针对资源可用性进行了优化。 - 您最多可以指定 5 个排名的虚拟机类型列表,每个列表最多包含 10 个虚拟机类型。
您可以在工作流模板 中添加灵活虚拟机,以便在从模板创建集群时提供针对资源不可用的弹性。
建议:启用 Managed Service for Apache Spark 自动选择可用区,以便 Managed Service for Apache Spark 选择有能力预配所请求虚拟机的可用区。
默认情况下,集群节点必须使用一种磁盘类型。您可以使用 磁盘覆盖为灵活虚拟机集群节点指定的不同机器类型指定不同的磁盘 类型。
虽然您可以为集群中的主要和辅助工作器虚拟机类型指定不同的 CPU 与内存比率,但这可能会导致性能下降,因为系统会将最小的 CPU 与内存比率用作最小的容器单元。
如果您的集群创建请求包含一 个自动扩缩政策, 则灵活的虚拟机可以来自不同的虚拟机系列,但必须具有相同的 内存量和核心数。
系统会先在同等级别中选择与预留匹配的机器类型,然后选择 CPU 数量最多的虚拟机类型。
Managed Service for Apache Spark 会对灵活的虚拟机预配应用 Google Cloud 配额 。
如果您更新使用灵活虚拟机创建的集群,Managed Service for Apache Spark 会从您在创建集群时提供的灵活虚拟机列表中选择并添加工作器。
如何请求灵活的虚拟机
您最多可以指定 5 个排名的虚拟机类型列表,每个列表最多包含 10 个虚拟机类型。排名最低的列表具有最高优先级。默认情况下,灵活虚拟机列表的排名为 0。在列表中,Managed Service for Apache Spark 会优先考虑具有未使用预留的虚拟机类型,然后考虑最大的虚拟机大小。列表中具有相同 CPU 数量的虚拟机类型会被同等对待。
在使用控制台、Google Cloud CLI 或 Dataproc API 创建 Managed Service for Apache Spark 集群时,您可以请求灵活的虚拟机。 Google Cloud
控制台
如需创建具有灵活虚拟机的集群,请执行以下操作:
- 打开 创建集群 页面。
- 点击其他配置 以展开该部分。
- 修改主要工作器 或辅助工作器 。 在添加工作器类型下,指定其他排名的虚拟机。
gcloud
将
gcloud dataproc clusters create
命令与 master-instance-selection、worker-instance-selection 和
secondary-worker-instance-selection
标志搭配使用,为主节点、主要工作器和
辅助工作器指定排名的灵活虚拟机列表。
以下示例请求具有以下优先级的主节点、主要工作器和辅助工作器虚拟机类型:
- 如果可用,则预配
e2-standard-8虚拟机(排名 0);如果e2-standard-8机器不可用,则预配n2-standard-8虚拟机(排名 1)。
由于未指定辅助工作器类型 ,因此系统将预配抢占式 Spot 辅助虚拟机。
gcloud dataproc clusters create CLUSTER_NAME \
--region=REGION \
--zone="" \
--master-instance-selection='{"machineTypes":["e2-standard-8"],"rank":0}' \
--master-instance-selection='{"machineTypes":["n2-standard-8"],"rank":1}' \
--num-workers=10 \
--worker-instance-selection='{"machineTypes":["e2-standard-8"],"rank":0}' \
--worker-instance-selection='{"machineTypes":["n2-standard-8"],"rank":1}' \
--num-secondary-workers=4 \
--secondary-worker-instance-selection='{"machineTypes":["e2-standard-8"],"rank":0}' \
--secondary-worker-instance-selection='{"machineTypes":["n2-standard-8"],"rank":1}'
注意:
--zone="":将此标志设置为空值可启用 自动选择可用区, 以便 Managed Service for Apache Spark 选择具有 可供使用的所请求虚拟机类型的可用区。此标志值会替换默认gcloud config list中指定的任何可用区选择。
API
使用 instanceFlexibilityPolicy.instanceSelectionList
作为 Dataproc API
clusters.create
请求的一部分,以指定主节点、主要工作器和辅助工作器的
machineTypes
排名列表。
示例:以下来自 clusters.create
请求正文
的 JSON 代码段指定了排名 0 和排名 1 的主节点 (masterConfig)、主工作节点 (workerConfig) 和辅助工作器
(secondaryWorkerConfig) 机器类型。
{
"projectId": "PROJECT_ID",
"clusterName": "CLUSTER_NAME",
"config": {
"gceClusterConfig": {
"zoneUri": ""
},
"masterConfig": {
"numInstances": 1,
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["e2-standard-8"],
"rank": 0
},
{
"machineTypes": ["n2-standard-8"],
"rank": 1
}
]
}
},
"workerConfig": {
"numInstances": 10,
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["e2-standard-8"],
"rank": 0
},
{
"machineTypes": ["n2-standard-8"],
"rank": 1
}
]
}
},
"secondaryWorkerConfig": {
"numInstances": 4,
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["e2-standard-8"],
"rank": 0
},
{
"machineTypes": ["n2-standard-8"],
"rank": 1
}
]
}
}
}
}
磁盘覆盖
您可以为灵活虚拟机规范中的每种机器类型(实例选择)指定磁盘覆盖。这样,您就可以自定义启动磁盘、覆盖本地 SSD 并为特定机器类型挂接其他磁盘。
磁盘覆盖选项和规则
磁盘覆盖配置选项:
- 基本磁盘配置:为集群节点指定的磁盘配置,
例如使用 gcloud CLI
--worker-boot-disk-size标志或workerConfig.diskConfig.bootDiskSizeGbDataproc API 字段为主要工作器指定启动磁盘大小。 - 实例选择磁盘覆盖 :为集群节点指定的机器类型的磁盘配置。
磁盘覆盖配置规则:
基本磁盘配置 :如果集群节点的任何实例选择都不包含
diskConfig覆盖,您可以为该节点定义基本磁盘配置。此基本磁盘配置将应用于该节点的所有实例选择。实例选择磁盘配置 :如果集群节点的实例选择包含
diskConfig覆盖,则节点组中的所有 实例选择都必须包含diskConfig(如果您还为该节点定义了基本磁盘配置,则会发生验证错误)。机器类型兼容性 :单个
InstanceSelection中的所有机器类型都必须与指定的diskConfig兼容。例如,您不能将不支持 Hyperdisk 的e2-standard-4机器类型与需要 Hyperdisk 的n4-standard-4机器类型分组到同一实例选择中,因为diskConfig无法同时满足这两种机器类型。本地 SSD 支持 :如果您在磁盘覆盖配置中配置了本地 SSD (
numLocalSsds> 0),则实例选择中的所有 机器类型都必须支持本地 SSD。强制性磁盘覆盖配置字段 :
- 如果您为实例选择定义了
diskConfig,则bootDiskType是强制性的。 - 如果您定义了
attachedDiskConfigs,则每个挂接的磁盘都必须包含diskType和diskSizeGb。
- 如果您为实例选择定义了
磁盘覆盖配置示例
以下示例为以下集群节点指定了以下磁盘覆盖配置选项:
- 主节点 :使用默认启动磁盘。
- 主要工作器 :为每个实例选择使用自定义磁盘:例如,
n4-standard-4使用hyperdisk-balanced,而n2-standard-4使用pd-standard。 - 辅助工作器 :使用自定义基本磁盘配置:
pd-ssd,大小为200 GB,该配置将应用于所有实例选择。
gcloud YAML
在 YAML 文件中为主节点、主工作节点和辅助工作器节点定义灵活虚拟机政策:
master-flex-policy.yaml:instanceFlexibilityPolicy: instanceSelectionList: - machineTypes: - e2-standard-8 rank: 0 - machineTypes: - n2-standard-8 rank: 1worker-flex-policy.yaml:instanceFlexibilityPolicy: instanceSelectionList: - machineTypes: - n4-standard-4 rank: 0 diskConfig: bootDiskType: hyperdisk-balanced bootDiskSizeGb: 100 bootDiskProvisionedIops: 6000 bootDiskProvisionedThroughput: 400 attachedDiskConfigs: - diskType: hyperdisk-throughput diskSizeGb: 300 - machineTypes: - n2-standard-4 rank: 0 diskConfig: bootDiskType: pd-standard bootDiskSizeGb: 400secondary-worker-flex-policy.yaml:instanceFlexibilityPolicy: instanceSelectionList: - machineTypes: - e2-standard-8 rank: 0 - machineTypes: - n2-standard-8 rank: 1
使用 gcloud dataproc clusters create
命令传递政策文件:
gcloud dataproc clusters create CLUSTER_NAME \
--region=REGION \
--zone="" \
--num-masters=1 \
--master-instance-flexibility-policy-file=master-flex-policy.yaml \
--num-workers=10 \
--worker-instance-flexibility-policy-file=worker-flex-policy.yaml \
--num-secondary-workers=4 \
--secondary-worker-boot-disk-type=pd-ssd \
--secondary-worker-boot-disk-size=200 \
--secondary-worker-instance-flexibility-policy-file=secondary-worker-flex-policy.yaml
gcloud JSON
使用 gcloud dataproc clusters create
命令和内嵌 JSON diskConfig 规范在 --worker-instance-selection 中:
gcloud dataproc clusters create CLUSTER_NAME \
--region=REGION \
--zone="" \
--num-masters=1 \
--master-instance-selection='{"machineTypes":["e2-standard-8"],"rank":0}' \
--master-instance-selection='{"machineTypes":["n2-standard-8"],"rank":1}' \
--num-workers=10 \
--worker-instance-selection='{"machineTypes":["n4-standard-4"],"rank":0,"diskConfig":{"bootDiskType":"hyperdisk-balanced","bootDiskSizeGb":100,"bootDiskProvisionedIops":6000,"bootDiskProvisionedThroughput":400,"attachedDiskConfigs":[{"diskType":"hyperdisk-throughput","diskSizeGb":300}]}}' \
--worker-instance-selection='{"machineTypes":["n2-standard-4"],"rank":0,"diskConfig":{"bootDiskType":"pd-standard","bootDiskSizeGb":400}}' \
--num-secondary-workers=4 \
--secondary-worker-boot-disk-type=pd-ssd \
--secondary-worker-boot-disk-size=200 \
--secondary-worker-instance-selection='{"machineTypes":["e2-standard-8"],"rank":0}' \
--secondary-worker-instance-selection='{"machineTypes":["n2-standard-8"],"rank":1}'
API
在 Dataproc API clusters.create 请求的 instanceFlexibilityPolicy.instanceSelectionList 中使用 diskConfig 字段。
JSON 请求正文示例:
{
"projectId": "PROJECT_ID",
"clusterName": "CLUSTER_NAME",
"config": {
"gceClusterConfig": {
"zoneUri": ""
},
"masterConfig": {
"numInstances": 1,
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["e2-standard-8"],
"rank": 0
},
{
"machineTypes": ["n2-standard-8"],
"rank": 1
}
]
}
},
"workerConfig": {
"numInstances": 10,
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["n4-standard-4"],
"rank": 0,
"diskConfig": {
"bootDiskType": "hyperdisk-balanced",
"bootDiskSizeGb": 100,
"bootDiskProvisionedIops": 6000,
"bootDiskProvisionedThroughput": 400,
"attachedDiskConfigs": [
{
"diskType": "HYPERDISK_THROUGHPUT",
"diskSizeGb": 2048
}
]
}
},
{
"machineTypes": ["n2-standard-4"],
"rank": 0,
"diskConfig": {
"bootDiskType": "pd-standard",
"bootDiskSizeGb": 400
}
}
]
}
},
"secondaryWorkerConfig": {
"numInstances": 4,
"diskConfig": {
"bootDiskType": "pd-ssd",
"bootDiskSizeGb": 200
},
"instanceFlexibilityPolicy": {
"instanceSelectionList": [
{
"machineTypes": ["e2-standard-8"],
"rank": 0
},
{
"machineTypes": ["n2-standard-8"],
"rank": 1
}
]
}
}
}
}
覆盖灵活虚拟机属性
Managed Service for Apache Spark 在集群级层设置属性。创建使用灵活虚拟机的集群时,您可以覆盖系统为主要工作器和辅助工作器灵活虚拟机类型生成的属性。
gcloud
如需在创建集群时覆盖属性,请使用 --properties 标志,语法如下:
--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
- ROLE 可以是
primary_worker或secondary_worker。 - 用英文逗号分隔多个属性。
以下 gcloud dataproc clusters create 命令会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。
此示例将 yarn-site.xml 中的 yarn.nodemanager.resource.cpu-vcores 值设置为 6,适用于所有 e2-standard-8 和 n2-standard-8 辅助工作器虚拟机。
gcloud dataproc clusters create CLUSTER_NAME \
--num-workers=10 \
--num-secondary-workers=4 \
--worker-machine-types="type=e2-standard-8,rank=0" \
--worker-machine-types="type=n2-standard-8,rank=1" \
--master-machine-types="type=e2-standard-8,rank=0" \
--master-machine-types="type=n2-standard-8,rank=1" \
--secondary-worker-machine-types="type=e2-standard-8,rank=0" \
--secondary-worker-machine-types="type=n2-standard-8,rank=1" \
--region=us-central1 \
--zone="" \
--properties="secondary_worker:e2-standard-8:yarn:yarn.nodemanager.resource.cpu-vcores=6,secondary_worker:n2-standard-8:yarn:yarn.nodemanager.resource.cpu-vcores=6"
API
如需覆盖属性,请在集群创建请求的
SoftwareConfig
对象的 properties 字段中定义这些属性。
属性键使用以下语法:
ROLE:MACHINE_TYPE:COMPONENT_PREFIX:COMPONENT_PROPERTY
- ROLE 可以是
primary_worker或secondary_worker。
以下 SoftwareConfig 对象会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。此示例将 yarn.nodemanager.resource.cpu-vcores 值设置为 6,适用于所有 e2-standard-8 和 n2-standard-8 辅助工作器虚拟机。
{
"imageVersion":"2.2.42",
"properties": {
"secondary_worker:e2-standard-8:yarn:yarn.nodemanager.resource.cpu-vcores" : "6",
"secondary_worker:n2-standard-8:yarn:yarn.nodemanager.resource.cpu-vcores" : "6"
}
}