灵活虚拟机是 Managed Service for Apache Spark 的一项功能,可让您在创建 Managed Service for Apache Spark 集群时为 Managed Service for Apache Spark 的主节点、主工作器节点和辅助工作器节点指定优先级的虚拟机类型列表。
为什么要使用灵活的虚拟机?
问题:如果您在提交集群创建请求时,某个虚拟机类型不可用,则请求会失败,您需要更新请求、脚本或代码,以指定“次优”虚拟机类型。此重新请求过程可能涉及多次迭代,直到您指定可用的虚拟机类型为止。
解决方案:Managed Service for Apache Spark 灵活虚拟机功能可帮助您成功发出集群创建请求,方法是从排名的虚拟机列表中选择主工作器、主工作器和辅助工作器虚拟机类型,然后在指定集群区域内搜索列出的虚拟机类型可用的可用区。
限制
术语
- 虚拟机类型:虚拟机实例的系列、内存容量和 CPU 核心数。Managed Service for Apache Spark 支持使用预定义和自定义虚拟机类型。
- 主节点和主工作节点:默认情况下,Managed Service for Apache Spark 集群有一个主节点和两个主工作节点。
- 高可用性 (HA) 集群有三个主节点。
- 单节点集群只有一个节点,该节点同时充当主节点和工作器节点。
- 零规模集群仅包含主节点和辅助工作器(不包含主要工作器)。
- 辅助工作器节点: 辅助工作器不存储数据,仅用作处理节点。您可以使用辅助工作器来伸缩计算,而无需伸缩存储空间。默认的灵活虚拟机辅助工作器类型是 Spot 虚拟机,这是一种抢占式类型。
用量
- 在 Managed Service for Apache Spark
2.0.74+、2.1.76+、2.2.42+及更高版本的imageversions中,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 选择有足够容量来预配所请求虚拟机的可用区。
默认情况下,集群节点必须使用一种磁盘类型。您可以使用磁盘替换为 Flex 虚拟机集群节点指定的不同机器类型指定不同的磁盘类型。
虽然您可以为集群中的主要和辅助工作器虚拟机类型指定不同的 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 控制台、Google Cloud CLI、Dataproc API、Managed Service for Apache Airflow 或 Terraform 创建 Managed Service for Apache Spark 集群时,您可以请求灵活的虚拟机。
控制台
如需创建具有灵活虚拟机的集群,请执行以下操作:
- 打开创建集群页面。
- 点击其他配置以展开该部分。
- 修改主要工作器或辅助工作器。 在添加工作器类型下,指定其他分级虚拟机。
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
在 Dataproc API clusters.create 请求中使用 instanceFlexibilityPolicy.instanceSelectionList 为主工作器、主要工作器和辅助工作器指定排名的 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
}
]
}
}
}
}
Cloud Composer
在 Apache Airflow DAG 中使用 DataprocCreateClusterOperator 运算符,为主工作器、主要工作器和辅助工作器指定 instance_flexibility_policy:
from airflow import DAG
from airflow.models import Variable
from airflow.providers.google.cloud.operators.dataproc import (
DataprocCreateClusterOperator,
)
from airflow.utils.dates import days_ago
PROJECT_ID = Variable.get("DATAPROC_PROJECT_ID")
REGION = Variable.get("DATAPROC_REGION")
CLUSTER_NAME = Variable.get("DATAPROC_CLUSTER_NAME")
NUM_WORKERS = int(Variable.get("DATAPROC_NUM_WORKERS"))
MIN_NUM_WORKERS = int(Variable.get("DATAPROC_MIN_NUM_WORKERS"))
FLEX_SELECTION_LIST = [
{
"machine_types": ["e2-standard-8"],
"rank": 0,
},
{
"machine_types": ["n2-standard-8"],
"rank": 1,
},
]
CLUSTER_CONFIG = {
"gce_cluster_config": {
"zone_uri": "",
},
"master_config": {
"num_instances": 1,
"instance_flexibility_policy": {
"instance_selection_list": FLEX_SELECTION_LIST,
},
},
"worker_config": {
"num_instances": NUM_WORKERS,
"min_num_instances": MIN_NUM_WORKERS,
"instance_flexibility_policy": {
"instance_selection_list": FLEX_SELECTION_LIST,
},
},
"secondary_worker_config": {
"num_instances": 4,
"instance_flexibility_policy": {
"instance_selection_list": FLEX_SELECTION_LIST,
},
},
}
with DAG(
"dataproc_flexvm_dag",
start_date=days_ago(1),
schedule_interval=None,
catchup=False,
) as dag:
create_dataproc_cluster = DataprocCreateClusterOperator(
task_id="create_dataproc_flexvm_cluster",
project_id=PROJECT_ID,
region=REGION,
cluster_name=CLUSTER_NAME,
cluster_config=CLUSTER_CONFIG,
)
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。 如需了解详情,请参阅 Terraform 提供程序参考文档。
使用包含 instance_flexibility_policy 块的 google_dataproc_cluster 资源来指定排名靠前的灵活虚拟机列表:
variable "project_id" {
type = string
description = "The Google Cloud project ID"
}
variable "region" {
type = string
description = "The Google Cloud region for Dataproc deployment"
}
variable "cluster_name" {
type = string
description = "Name of the Dataproc cluster"
}
variable "num_workers" {
type = number
description = "Target number of primary workers"
}
variable "min_num_workers" {
type = number
description = "Minimum primary workers for partial cluster creation"
}
resource "google_dataproc_cluster" "flex_cluster" {
name = var.cluster_name
project = var.project_id
region = var.region
cluster_config {
gce_cluster_config {
zone = ""
}
master_config {
num_instances = 1
instance_flexibility_policy {
instance_selection_list {
machine_types = ["e2-standard-8"]
rank = 0
}
instance_selection_list {
machine_types = ["n2-standard-8"]
rank = 1
}
}
}
worker_config {
num_instances = var.num_workers
min_num_instances = var.min_num_workers
instance_flexibility_policy {
instance_selection_list {
machine_types = ["e2-standard-8"]
rank = 0
}
instance_selection_list {
machine_types = ["n2-standard-8"]
rank = 1
}
}
}
secondary_worker_config {
num_instances = 4
instance_flexibility_policy {
instance_selection_list {
machine_types = ["e2-standard-8"]
rank = 0
}
instance_selection_list {
machine_types = ["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,则必须为每个附加的磁盘指定type和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: - type: 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 命令,并在 --worker-instance-selection 中使用内嵌 JSON diskConfig 规范:
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":[{"type":"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": [
{
"type": "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
}
]
}
}
}
}
替换 Flex 虚拟机属性
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 中所有 e2-standard-8 和 n2-standard-8 次要工作器虚拟机的 yarn.nodemanager.resource.cpu-vcores 值设置为 6。
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}' \
--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 数量。此示例将所有 e2-standard-8 和 n2-standard-8 辅助工作器虚拟机的 yarn.nodemanager.resource.cpu-vcores 值设置为 6。
{
"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"
}
}