フレキシブル VM は、Managed Service for Apache Spark クラスタを作成するときに、Managed Service for Apache Spark のマスターノード、プライマリ ワーカーノード、セカンダリ ワーカーノードの VM タイプの優先リストを指定できる Managed Service for Apache Spark の機能です。
フレキシブル VM を使用する理由
問題: クラスタ作成リクエストの送信時に VM タイプを使用できない場合、リクエストは失敗し、リクエスト、スクリプト、コードを更新して「次善の」VM タイプを指定する必要があります。この再リクエスト プロセスでは、使用可能な VM タイプを指定できるようになるまで、複数回の反復処理が必要になる場合があります。
解決策: Managed Service for Apache Spark フレキシブル VM 機能は、ランク付けされた VM リストからマスター、プライマリ、セカンダリ ワーカー VM タイプを選択し、リストされた VM タイプが利用可能な指定されたクラスタ リージョン内のゾーンを検索することで、クラスタ作成リクエストを成功させるのに役立ちます。
制限事項
- フレキシブル VM を使用するクラスタは停止できません。
- 高可用性クラスタのマスターノードはフレキシブル VM を使用できませんが、HA クラスタのワーカーノードはフレキシブル VM を使用できます。
用語
- VM タイプ: VM インスタンスのファミリー、メモリ容量、CPU コア数。Managed Service for Apache Spark は、事前定義された VM タイプとカスタム VM タイプの使用をサポートしています。
- マスターノードとプライマリ ワーカーノード: デフォルトでは、Managed Service for Apache Spark クラスタには 1 つのマスターノードと 2 つのプライマリ ワーカーノードがあります。
- 高可用性(HA)クラスタには 3 つのマスターノードがあります。
- 単一ノードクラスタには、マスターノードとワーカーノードの両方として機能するノードが 1 つあります。
- ゼロスケール クラスタには、マスターノードとセカンダリ ワーカーのみがあります(プライマリ ワーカーはありません)。
- セカンダリ ワーカーノード: セカンダリ ワーカーはデータを保存せず、処理ノードとしてのみ機能します。セカンダリ ワーカーを使用すると、ストレージをスケーリングせずにコンピューティングをスケーリングできます。デフォルトのフレキシブル VM セカンダリ ワーカー タイプは Spot VM であり、プリエンプティブル タイプです。
用途
- フレキシブル VM は、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 シリーズのマシンタイプのランキング リストなど、フレキシブル VM マシンタイプのランキング リストでノードを指定します。このリストは、リソースの可用性を最適化するように調整されています。
- イメージ バージョン
ランク付けされた VM タイプのリストを最大 5 つ指定できます。リスト内の VM タイプは最大 10 個です。
ワークフロー テンプレートにフレキシブル VM を含めると、テンプレートからクラスタが作成されたときに、リソースの利用不可に対する復元力を提供できます。
推奨事項: Managed Service for Apache Spark の自動ゾーン配置を有効にします。これにより、Managed Service for Apache Spark は、リクエストされた VM をプロビジョニングできる容量を持つゾーンを選択できます。
デフォルトでは、クラスタノードは 1 つのディスクタイプを使用する必要があります。ディスクのオーバーライドを使用すると、Flex VM クラスタノードに指定されたマシンタイプごとに異なるディスクタイプを指定できます。
クラスタ内のプライマリ ワーカーとセカンダリ ワーカーの VM タイプに異なる CPU とメモリの比率を指定できますが、最小の CPU とメモリの比率が最小のコンテナ単位として使用されるため、パフォーマンスが低下する可能性があります。
クラスタ作成リクエストに自動スケーリング ポリシーが含まれている場合、フレキシブル VM は異なる VM ファミリーから利用できますが、メモリとコアの数は同じである必要があります。
予約に一致するマシンタイプがランク内で最初に選択され、次に CPU 数が最も多い VM タイプが選択されます。
Managed Service for Apache Spark は、フレキシブル VM プロビジョニングに Google Cloud 割り当てを適用します。
フレキシブル VM を使用して作成されたクラスタを更新すると、Managed Service for Apache Spark は、クラスタの作成時に指定したフレキシブル VM リストからワーカーを選択して追加します。
フレキシブル VM をリクエストする方法
ランク付けされた VM タイプのリストを最大 5 つ指定できます。リスト内の VM タイプは最大 10 個です。優先度が最も高いのは、ランクが最も低いリストです。デフォルトでは、フレキシブル 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 を含むクラスタを作成する手順は次のとおりです。
- [クラスタの作成] ページを開きます。
- [その他の構成] をクリックして、セクションを開きます。
- [プライマリ ワーカー] または [セカンダリ ワーカー] を編集します。[ワーカータイプを追加] で、追加のランク付けされた VM を指定します。
gcloud
master-instance-selection、worker-instance-selection、secondary-worker-instance-selection フラグを指定した gcloud dataproc clusters create コマンドを使用して、マスター、プライマリ、セカンダリ ワーカーのランキングされたフレキシブル VM リストを指定します。
次の例では、次の優先度でマスター、プライマリ、セカンダリの VM タイプをリクエストします。
e2-standard-8VM を使用できる場合はプロビジョニングします(ランク 0)。e2-standard-8マシンを使用できない場合は、n2-standard-8VM をプロビジョニングします(ランク 1)。
セカンダリ ワーカー タイプが指定されていないため、プリエンプティブル 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 を使用して、マスター ワーカー、プライマリ ワーカー、セカンダリ ワーカーの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 プロバイダのリファレンス ドキュメントをご覧ください。
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 フィールドを使用して、プライマリ ワーカーのブートディスク サイズを指定します。 - インスタンス選択ディスクのオーバーライド: クラスタノードに指定されたマシンタイプのディスク構成。
ディスクのオーバーライド構成ルール:
ベースディスク構成: クラスタノードのインスタンス選択に
diskConfigオーバーライドが含まれていない場合は、ノードのベースディスク構成を定義できます。このベースディスク構成は、ノードのすべてのインスタンス選択に適用されます。インスタンス選択ディスク構成: クラスタノードのインスタンス選択に
diskConfigオーバーライドが含まれている場合、ノードグループ内のすべてのインスタンス選択にdiskConfigを含める必要があります(ノードのベースディスク構成も定義すると、検証エラーが発生します)。マシンタイプの互換性: 単一の
InstanceSelection内のすべてのマシンタイプは、指定されたdiskConfigと互換性がある必要があります。たとえば、diskConfigは両方のマシンタイプを満たすことができないため、ハイパーディスクをサポートしていないe2-standard-4マシンタイプとハイパーディスクを必要とするn4-standard-4マシンタイプを同じインスタンス選択でグループ化することはできません。ローカル 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 ファイルで、柔軟な 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
--worker-instance-selection でインライン JSON diskConfig 仕様を使用して gcloud dataproc clusters create コマンドを使用します。
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 VM のプロパティをオーバーライドする
Managed Service for Apache Spark は、クラスタレベルでプロパティを設定します。フレキシブル VM を使用するクラスタを作成するときに、プライマリ ワーカーとセカンダリ ワーカーの Flex VM タイプのシステム生成プロパティをオーバーライドできます。
gcloud
クラスタの作成時にプロパティをオーバーライドするには、次の構文で --properties フラグを使用します。
--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
- ROLE は、
primary_workerまたはsecondary_workerのいずれかになります。 - 複数のプロパティを指定する場合は、カンマで区切ります。
次の gcloud dataproc clusters create コマンドは、YARN がセカンダリ ワーカーの NodeManager に割り当てる vCPU の数をオーバーライドします。この例では、すべての e2-standard-8 と n2-standard-8 のセカンダリ ワーカー 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 がセカンダリ ワーカーの NodeManager に割り当てる vCPU の数をオーバーライドします。この例では、すべての e2-standard-8 と n2-standard-8 のセカンダリ ワーカー 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"
}
}