彈性 VM 是 Managed Service for Apache Spark 的一項功能,可讓您在建立 Managed Service for Apache Spark 叢集時,為 Managed Service for Apache Spark 主要、主要和次要 worker 節點指定VM 類型的優先順序清單。
使用彈性 VM 的好處
問題:提交叢集建立要求時,如果 VM 類型無法使用,要求就會失敗,您必須更新要求、指令碼或程式碼,指定「次佳」VM 類型。這個重新要求程序可能需要多次反覆操作,直到您指定可用的 VM 類型為止。
解決方案:Managed Service for Apache Spark 彈性 VM 功能會從已排序的 VM 清單中,選取主要執行個體、主要和次要 worker VM 類型,然後在指定叢集區域中搜尋列出的 VM 類型可用的可用區,協助您成功建立叢集。
限制
術語
- VM 類型:VM 執行個體的系列、記憶體容量和 CPU 核心數。Managed Service for Apache Spark 支援使用預先定義和自訂 VM 類型。
- 主要執行個體和主要 worker 節點:根據預設,Managed Service for Apache Spark 叢集有一個主要執行個體節點和兩個主要 worker 節點。
- 高可用性 (HA) 叢集有三個主要節點。
- 單一節點叢集有一個節點,同時做為主要和 worker 節點。
- 零規模叢集只有一個主要節點和次要 worker (沒有主要 worker)。
- 次要 worker 節點: 次要 worker 不會儲存資料,僅做為處理節點。您可以使用次要 worker 擴充運算資源,不必擴充儲存空間。彈性 VM 的預設次要 worker 類型為 Spot VM,屬於先占類型。
用量
- Managed Service for Apache Spark
2.0.74+、2.1.76+、2.2.42+和後續imageversions,皆提供彈性 VM。- 從映像檔版本
3.0開始,如果您在建立叢集時未指定叢集節點的機型,Managed Service for Apache Spark 會根據資源可用性,以彈性 VM 機型的排名清單 (例如 N4、N2 和 E2 系列機型的排名清單) 指定節點。
- 從映像檔版本
您最多可以指定五個已排序的 VM 類型清單,每個清單最多可包含 10 個 VM 類型。
您可以在工作流程範本中加入彈性 VM,這樣一來,當您依據範本建立叢集時,即使資源無法使用,也能保持彈性。
建議:啟用 Managed Service for Apache Spark 自動可用區配置,讓 Managed Service for Apache Spark 選擇有足夠容量佈建所需 VM 的可用區。
根據預設,叢集節點必須使用一種磁碟類型。您可以使用磁碟覆寫,為 Flex VM 叢集節點指定的不同機型指定不同磁碟類型。
雖然您可以為叢集中的主要和次要 worker VM 類型指定不同的 CPU 與記憶體比率,但這可能會導致效能下降,因為系統會將最小的 CPU 與記憶體比率做為最小的容器單元。
如果叢集建立要求包含自動調度資源政策,彈性 VM 可以來自不同 VM 系列,但必須具有相同記憶體容量和核心數。
系統會先選取符合預留項目的機型,然後選取 CPU 數量最多的 VM 類型。
Managed Service for Apache Spark 會對彈性 VM 佈建套用 Google Cloud 配額。
如果您更新使用彈性 VM 建立的叢集,Managed Service for Apache Spark 會從您建立叢集時提供的彈性 VM 清單中選取並新增 worker。
如何要求彈性 VM
您最多可以指定五個已排序的 VM 類型清單,每個清單最多可包含 10 個 VM 類型。排名最低的名單優先順序最高。根據預設,彈性 VM 清單的等級為 0。在清單中,Managed Service for Apache Spark 會優先使用有未用預留項目的 VM 類型,其次是最大的 VM 大小。清單中 CPU 數量相同的 VM 類型會視為相同。
使用 Google Cloud 控制台、Google Cloud CLI、Dataproc API、Managed Service for Apache Airflow 或 Terraform 建立 Managed Service for Apache Spark 叢集時,可以要求彈性 VM。
控制台
如要建立具有彈性 VM 的叢集,請按照下列步驟操作:
- 開啟「Create cluster」(建立叢集) 頁面。
- 按一下「其他設定」展開該部分。
- 編輯「主要 worker」或「次要 worker」。在「Add worker types」(新增 worker 類型) 下方,指定其他有排名的 VM。
gcloud
使用 gcloud dataproc clusters create 指令搭配 master-instance-selection、worker-instance-selection 和 secondary-worker-instance-selection 旗標,為主要、主要和次要 worker 指定已排序的彈性 VM 清單。
下列範例會要求主要、主要和次要 VM 類型,並設定下列優先順序:
- 如果
e2-standard-8VM 可用,則佈建該 VM (等級 0);如果e2-standard-8機器無法使用,則佈建n2-standard-8VM (等級 1)。
由於未指定次要 worker 類型,系統會佈建先占 Spot 次要 VM。
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 選擇有要求 VM 類型的可用區。這個旗標值會覆寫預設gcloud config list中指定的任何可用區選取項目。
API
在 Dataproc API clusters.create 要求中使用 instanceFlexibilityPolicy.instanceSelectionList,為主要、主要和次要 worker 指定 machineTypes 的排序清單。
範例:下列 clusters.create
要求主體 的 JSON 程式碼片段,指定主要執行個體 (masterConfig)、主要 worker (workerConfig) 和次要 worker (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 運算子,為主要執行個體、主要 worker 和次要 worker 指定 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 區塊,指定已排序的彈性 VM 清單:
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
}
}
}
}
}
磁碟覆寫
您可以在彈性 VM 規格中,為每種機器類型 (執行個體選項) 指定磁碟覆寫設定。這樣一來,您就能自訂開機磁碟、覆寫本機 SSD,以及為特定機器類型附加額外磁碟。
磁碟覆寫選項和規則
磁碟覆寫設定選項:
- 基本磁碟設定:為叢集節點指定的磁碟設定,例如使用 gcloud CLI
--worker-boot-disk-size旗標或workerConfig.diskConfig.bootDiskSizeGbDataproc API 欄位,為主要 worker 指定開機磁碟大小。 - 執行個體選取磁碟覆寫:為叢集節點指定的機型磁碟設定。
磁碟覆寫設定規則:
基礎磁碟設定:如果叢集節點的執行個體選取項目不含
diskConfig覆寫,您可以為節點定義基礎磁碟設定。這個基本磁碟設定會套用至節點的所有執行個體選項。執行個體選取磁碟設定:如果叢集節點的執行個體選取項目包含
diskConfig覆寫,則節點群組中的「所有」執行個體選取項目都必須包含diskConfig(如果您也為節點定義基礎磁碟設定,則會發生驗證錯誤)。機型相容性:單一
InstanceSelection內的所有機型都必須與指定的diskConfig相容。舉例來說,您無法在同一個執行個體選項中,將不支援 Hyperdisk 的e2-standard-4機型與需要 Hyperdisk 的n4-standard-4機型分在同一組,因為diskConfig無法同時滿足這兩種機型。本機 SSD 支援:如果您在磁碟覆寫設定中設定本機 SSD (
numLocalSsds> 0),則執行個體選取項目中的「所有」機型都必須支援本機 SSD。強制磁碟覆寫設定欄位:
- 如果您為執行個體選取項目定義
diskConfig,則必須提供bootDiskType。 - 如果定義
attachedDiskConfigs,則每個連接的磁碟都必須同時具備type和diskSizeGb。
- 如果您為執行個體選取項目定義
磁碟覆寫設定範例
以下範例為下列叢集節點指定下列磁碟覆寫設定選項:
- 主要節點:使用預設開機磁碟。
- 主要 worker:依據執行個體選取項目使用自訂磁碟,例如
n4-standard-4使用hyperdisk-balanced,n2-standard-4則使用pd-standard。 - 次要 worker:使用自訂基礎磁碟設定:
pd-ssd搭配200 GB,這項設定會套用至所有執行個體選項。
gcloud YAML
在 YAML 檔案中,為主要執行個體、主要 worker 和次要 worker 節點定義彈性 VM 政策:
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
}
]
}
}
}
}
覆寫彈性 VM 屬性
Managed Service for Apache Spark 會在叢集層級設定屬性。建立使用彈性 VM 的叢集時,您可以覆寫系統為主要和次要 worker 彈性 VM 類型產生的屬性。
gcloud
如要在建立叢集時覆寫屬性,請使用 --properties 旗標,語法如下:
--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
- ROLE 可以是
primary_worker或secondary_worker。 - 如有多個屬性,請以半形逗號分隔。
下列 gcloud dataproc clusters create 指令會覆寫 YARN 在次要 worker 上為 NodeManager 分配的 vCPU 數量。這個範例會將所有 e2-standard-8 和 n2-standard-8 次要 worker VM 的 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_worker或secondary_worker。
下列 SoftwareConfig 物件會覆寫 YARN 為次要 worker 上的 NodeManager 分配的 vCPU 數量。這個範例會將所有 e2-standard-8 和 n2-standard-8 次要 worker VM 的 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"
}
}