フレキシブル 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 は、リソースの可用性に合わせて最適化された、フレキシブル VM マシンタイプのランク付けされたリスト(N4、N2、E2 シリーズのマシンタイプのランク付けされたリストなど)を使用してノードを指定します。
- イメージ バージョン
ランク付けされた 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 プロバイダのリファレンス ドキュメントをご覧ください。
instance_flexibility_policy ブロックを含む google_dataproc_cluster リソースを使用して、ランク付けされたフレキシブル 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を使用します。 - セカンダリ ワーカー: カスタムベース ディスク構成(
200 GBを含むpd-ssd)を使用します。これは、すべてのインスタンス選択に適用されます。
gcloud YAML
マスターノード、プライマリ ワーカーノード、セカンダリ ワーカーノードのフレキシブル VM ポリシーを 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
--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 を使用するクラスタを作成するときに、プライマリ ワーカーとセカンダリ ワーカーのフレキシブル 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"
}
}