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

灵活虚拟机是 Managed Service for Apache Spark 的一项功能,可让您指定 优先级的 虚拟机类型 列表,以便在您 创建 Managed Service for Apache Spark 集群时用于 Managed Service for Apache Spark 主节点、主要工作器节点和辅助工作器节点。

为什么要使用灵活的虚拟机?

问题:如果您在提交集群创建请求时,某个虚拟机类型不可用,则请求会失败,您需要更新请求、脚本或代码,以指定“次优”虚拟机类型。此重新请求过程可能涉及多次迭代,直到您指定可用的虚拟机类型为止。

解决方案:Managed Service for Apache Spark 灵活虚拟机功能可帮助您成功发出集群创建请求,方法是从排名的虚拟机列表中选择主节点、主要工作器虚拟机和辅助工作器虚拟机类型,然后在指定集群区域内搜索列出的虚拟机类型可用的可用区。

限制

术语

用法

  • 灵活虚拟机在 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

控制台

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

  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 代码段指定了排名 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.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,则每个挂接的磁盘都必须包含 diskTypediskSizeGb

磁盘覆盖配置示例

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

  • 主节点 :使用默认启动磁盘。
  • 主要工作器 :为每个实例选择使用自定义磁盘:例如,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:
          - diskType: 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 命令和内嵌 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_workersecondary_worker
  • 用英文逗号分隔多个属性。

以下 gcloud dataproc clusters create 命令会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。 此示例将 yarn-site.xml 中的 yarn.nodemanager.resource.cpu-vcores 值设置为 6,适用于所有 e2-standard-8n2-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_workersecondary_worker

以下 SoftwareConfig 对象会覆盖 YARN 为辅助工作器上的 NodeManager 分配的 vCPU 数量。此示例将 yarn.nodemanager.resource.cpu-vcores 值设置为 6,适用于所有 e2-standard-8n2-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"
  }
}

后续步骤