フレキシブル 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 は、リソースの可用性に合わせて最適化された、フレキシブル 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 を持つクラスタを作成する手順は以下のとおりです。

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

gcloud

master-instance-selection、worker-instance-selection、secondary-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 プロバイダのリファレンス ドキュメントをご覧ください。

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.bootDiskSizeGb Dataproc 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 ファイルで定義します。

  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 を使用するクラスタを作成するときに、プライマリ ワーカーとセカンダリ ワーカーのフレキシブル 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"
  }
}

次のステップ