确定灵活虚拟机的虚拟机类型优先级

灵活虚拟机是 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+ 及更高版本 imageversions
    • 从映像版本 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 控制台、Google Cloud CLI、Dataproc API、 Managed Service for Apache Airflow 或 Terraform 创建 Managed Service for Apache Spark 集群时请求灵活的虚拟机。

控制台

如需创建具有灵活虚拟机的集群,请执行以下操作:

  1. 打开 创建集群 页面。
  2. 点击其他配置 以展开该部分。
  3. 修改主要工作器辅助工作器 。 在添加工作器类型下,指定其他排名的虚拟机。

gcloud

gcloud dataproc clusters create 命令与 master-instance-selectionworker-instance-selectionsecondary-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 代码段为主节点 (masterConfig)、主工作节点 (workerConfig) 和辅助工作器 (secondaryWorkerConfig) 指定了等级 0 和等级 1 的机器类型。

{
  "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 提供方参考文档

google_dataproc_cluster 资源与 instance_flexibility_policy 块搭配使用,以指定排名的灵活 虚拟机列表:

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.bootDiskSizeGb Dataproc API 字段为主要工作器指定启动磁盘大小。
  • 实例选择磁盘覆盖 :为集群节点指定的机器类型的磁盘配置。

磁盘覆盖配置规则:

  • 基本磁盘配置 :如果集群节点的任何实例选择都不包含 diskConfig 覆盖,您可以为该节点定义基本磁盘配置。此基本磁盘配置将应用于该节点的所有实例选择。

  • 实例选择磁盘配置 :如果集群节点的某个实例选择包含 diskConfig 覆盖,则节点组中的所有 实例选择都必须包含 diskConfig(如果您还为该节点定义了基本磁盘配置,则会发生验证错误)。

  • 机器类型兼容性 :单个 InstanceSelection 中的所有机器类型都必须与指定的 diskConfig 兼容。例如,您不能将不支持 Hyperdisk 的 e2-standard-4 机器类型与需要 Hyperdisk 的 n4-standard-4 机器类型分组到同一实例选择中,因为 diskConfig 无法同时满足这两种机器类型。

  • 本地 SSD 支持 :如果您在磁盘覆盖配置中配置了本地 SSD (numLocalSsds > 0),则实例选择中的所有 机器类型都必须支持本地 SSD。

  • 强制性磁盘覆盖配置字段

    • 如果您为实例选择定义了 diskConfig,则 bootDiskType 是强制性的。
    • 如果您定义了 attachedDiskConfigs,则每个挂接的磁盘都必须包含 typediskSizeGb

磁盘覆盖配置示例

以下示例为以下集群节点指定了以下磁盘覆盖配置选项:

  • 主节点 :使用默认启动磁盘。
  • 主要工作器 :为每个实例选择使用自定义磁盘:例如,n4-standard-4 使用 hyperdisk-balanced,而 n2-standard-4 使用 pd-standard
  • 辅助工作器 :使用自定义基本磁盘配置:pd-ssd,大小为 200 GB,应用于所有实例选择。

gcloud YAML

在 YAML 文件中为主节点、主工作节点和辅助工作器节点定义灵活虚拟机政策:

  1. master-flex-policy.yaml
    instanceFlexibilityPolicy:
      instanceSelectionList:
      -   machineTypes:
        -   e2-standard-8
        rank: 0
      -   machineTypes:
        -   n2-standard-8
        rank: 1
  2. worker-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: 400
  3. secondary-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
          }
        ]
      }
    }
  }
}

覆盖灵活虚拟机属性

Managed Service for Apache Spark 在集群级层设置属性。创建使用灵活虚拟机的集群时,您可以覆盖系统为主要工作器和辅助工作器灵活虚拟机类型生成的属性。

gcloud

如需在创建集群时覆盖属性,请使用 --properties 标志,语法如下:

--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
  • ROLE 可以是 primary_workersecondary_worker
  • 用英文逗号分隔多个属性。

以下 gcloud dataproc clusters create 命令会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。此示例将所有 e2-standard-8n2-standard-8 辅助工作器虚拟机的 yarn-site.xml 中的 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_workersecondary_worker

以下 SoftwareConfig 对象会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。此示例将所有 e2-standard-8n2-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"
  }
}

后续步骤