フレキシブル VM で VM タイプの優先順位を付ける

フレキシブル 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 つのプライマリ ワーカーノードがあります。
  • セカンダリ ワーカーノード: セカンダリ ワーカーはデータを保存せず、処理ノードとしてのみ機能します。セカンダリ ワーカーを使用すると、ストレージをスケーリングせずにコンピューティングをスケーリングできます。デフォルトのフレキシブル 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 を含むクラスタを作成する手順は次のとおりです。

  1. [クラスタの作成] ページを開きます。
  2. [その他の構成] をクリックして、セクションを開きます。
  3. [プライマリ ワーカー] または [セカンダリ ワーカー] を編集します。[ワーカータイプを追加] で、追加のランク付けされた VM を指定します。

gcloud

master-instance-selectionworker-instance-selectionsecondary-worker-instance-selection フラグを指定した gcloud dataproc clusters create コマンドを使用して、マスター、プライマリ、セカンダリ ワーカーのランキングされたフレキシブル VM リストを指定します。

次の例では、次の優先度でマスター、プライマリ、セカンダリの VM タイプをリクエストします。

  • e2-standard-8 VM を使用できる場合はプロビジョニングします(ランク 0)。e2-standard-8 マシンを使用できない場合は、n2-standard-8 VM をプロビジョニングします(ランク 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.bootDiskSizeGb Dataproc API フィールドを使用して、プライマリ ワーカーのブートディスク サイズを指定します。
  • インスタンス選択ディスクのオーバーライド: クラスタノードに指定されたマシンタイプのディスク構成。

ディスクのオーバーライド構成ルール:

  • ベースディスク構成: クラスタノードのインスタンス選択に diskConfig オーバーライドが含まれていない場合は、ノードのベースディスク構成を定義できます。このベースディスク構成は、ノードのすべてのインスタンス選択に適用されます。

  • インスタンス選択ディスク構成: クラスタノードのインスタンス選択に diskConfig オーバーライドが含まれている場合、ノードグループ内のすべてのインスタンス選択に diskConfig を含める必要があります(ノードのベースディスク構成も定義すると、検証エラーが発生します)。

  • マシンタイプの互換性: 単一の InstanceSelection 内のすべてのマシンタイプは、指定された diskConfig と互換性がある必要があります。たとえば、diskConfig は両方のマシンタイプを満たすことができないため、ハイパーディスクをサポートしていない e2-standard-4 マシンタイプとハイパーディスクを必要とする n4-standard-4 マシンタイプを同じインスタンス選択でグループ化することはできません。

  • ローカル SSD のサポート: ディスクのオーバーライド構成でローカル SSD(numLocalSsds > 0)を構成する場合、インスタンス選択のすべてのマシンタイプがローカル SSD をサポートしている必要があります。

  • 必須のディスク オーバーライド構成フィールド:

    • インスタンス選択に diskConfig を定義する場合は、bootDiskType が必須です。
    • attachedDiskConfigs を定義する場合は、アタッチされた各ディスクに typediskSizeGb の両方が必要です。

ディスクのオーバーライド構成の例

次の例では、次のクラスタノードに対して次のディスク オーバーライド構成オプションを指定します。

  • マスターノード: デフォルトのブートディスクを使用します。
  • プライマリ ワーカー: インスタンスごとにカスタマイズされたディスクを使用する選択: たとえば、n4-standard-4hyperdisk-balanced を使用し、n2-standard-4pd-standard を使用します。
  • セカンダリ ワーカー: カスタム ベースディスク構成を使用します。pd-ssd200 GB を使用します。これは、すべてのインスタンス選択に適用されます。

gcloud YAML

マスターノード、プライマリ ワーカーノード、セカンダリ ワーカーノードの YAML ファイルで、柔軟な VM ポリシーを定義します。

  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

--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-8n2-standard-8 のセカンダリ ワーカー VM の yarn-site.xmlyarn.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-8n2-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"
  }
}

次のステップ