가변형 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 유형을 사용할 수 있습니다.
  • 마스터 및 기본 워커 노드: 기본적으로 Managed Service for Apache Spark 클러스터에는 마스터 노드 1개와 기본 워커 노드 2개가 있습니다.
  • 보조 작업자 노드: 보조 작업자 는 데이터를 저장하지 않으며 처리 노드 역할만 합니다. 보조 작업자를 사용하여 스토리지를 확장하지 않고 컴퓨팅을 확장할 수 있습니다. 기본 가변형 VM 보조 작업자 유형은 선점형 유형인 스팟 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 유형을 최대 10개까지 포함하여 최대 5개의 순위 지정 VM 유형 목록을 지정할 수 있습니다.

  • 워크플로 템플릿에 가변형 VM을 포함하여 템플릿에서 클러스터를 만들 때 리소스 사용 불가능에 대한 복원력을 제공할 수 있습니다.

    권장사항: Managed Service for Apache Spark가 요청된 VM을 프로비저닝할 수 있는 용량이 있는 영역을 선택할 수 있도록 Managed Service for Apache Spark 자동 영역 배치를 사용 설정합니다.

  • 기본적으로 클러스터 노드는 하나의 디스크 유형을 사용해야 합니다. 디스크 재정의를 사용하여 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 유형을 최대 10개까지 포함하여 최대 5개의 순위 지정 VM 유형 목록을 지정할 수 있습니다. 순위가 가장 낮은 목록은 우선순위가 가장 높습니다. 기본적으로 가변형 VM 목록의 순위는 0입니다. 목록 내에서 Managed Service for Apache Spark는 사용되지 않은 예약이 있는 VM 유형을 우선하고 그 다음으로 가장 큰 VM 크기에 우선순위를 둡니다. 목록 내에서 CPU 수가 동일한 VM 유형은 동일하게 취급됩니다.

콘솔, Google Cloud CLI, Dataproc API, Managed Service for Apache Airflow 또는 Terraform을 사용하여 Managed Service for Apache Spark 클러스터를 만들 때 가변형 VM을 요청할 수 있습니다. Google Cloud

콘솔

가변형 VM으로 클러스터를 만들려면 다음 단계를 따르세요.

  1. 클러스터 만들기 페이지를 엽니다.
  2. 추가 구성 을 클릭하여 섹션을 펼칩니다.
  3. 기본 작업자 또는 보조 작업자 를 수정합니다. 작업자 유형 추가에서 순위가 지정된 추가 VM을 지정합니다.

gcloud

gcloud dataproc clusters create 명령어를 master-instance-selection, worker-instance-selectionsecondary-worker-instance-selection 플래그와 함께 사용하여 마스터, 기본 및 보조 작업자에 대해 순위가 지정된 가변형 VM 목록을 지정합니다.

다음 예에서는 우선순위가 다음과 같은 마스터, 기본, 보조 VM 유형을 요청합니다.

  • 사용 가능한 경우 e2-standard-8 VM을 프로비저닝합니다 (순위 0). e2-standard-8 머신을 사용할 수 없는 경우 n2-standard-8 VM을 프로비저닝합니다 (순위 1).

보조 작업자 유형이 지정되지 않았으므로 선점형 스팟 보조 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

instanceFlexibilityPolicy.instanceSelectionList 를 Dataproc API clusters.create 요청의 일부로 사용하여 마스터, 기본, 보조 작업자의 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와 호환되어야 합니다. 예를 들어 하이퍼디스크를 지원하지 않는 e2-standard-4 머신 유형을 하이퍼디스크가 필요한 n4-standard-4 머신 유형과 동일한 인스턴스 선택에서 그룹화할 수 없습니다. diskConfig가 두 머신 유형을 모두 충족할 수 없기 때문입니다.

  • 로컬 SSD 지원: 디스크 재정의 구성에서 로컬 SSD (numLocalSsds > 0)를 구성하는 경우 인스턴스 선택의 모든 머신 유형이 로컬 SSD를 지원해야 합니다.

  • 필수 디스크 재정의 구성 필드:

    • 인스턴스 선택에 diskConfig를 정의하는 경우 bootDiskType은 필수입니다.
    • attachedDiskConfigs를 정의하는 경우 연결된 각 디스크에 typediskSizeGb가 모두 필수입니다.

디스크 재정의 구성 예시

다음 예에서는 다음 클러스터 노드에 대해 다음과 같은 디스크 재정의 구성 옵션을 지정합니다.

  • 마스터 노드: 기본 부팅 디스크를 사용합니다.
  • 기본 작업자: 인스턴스 선택별로 맞춤설정된 디스크를 사용합니다. 예를 들어 n4-standard-4hyperdisk-balanced를 사용하고 n2-standard-4pd-standard를 사용합니다.
  • 보조 작업자: 맞춤 기본 디스크 구성(pd-ssd 200 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"
  • ROLEprimary_worker 또는 secondary_worker일 수 있습니다.
  • 쉼표로 여러 속성을 구분합니다.

다음 gcloud dataproc clusters create 명령어는 보조 작업자의 NodeManager에 YARN이 할당하는 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
  • ROLEprimary_worker 또는 secondary_worker일 수 있습니다.

다음 SoftwareConfig 객체는 보조 작업자의 NodeManager에 YARN이 할당하는 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"
  }
}

다음 단계