優先使用彈性 VM 類型

彈性 VM 是 Managed Service for Apache Spark 的一項功能,可讓您在建立 Managed Service for Apache Spark 叢集時,為 Managed Service for Apache Spark 主節點、主要和次要工作站節點指定VM 類型的優先順序清單。

為何要使用彈性 VM?

問題:提交叢集建立要求時,如果 VM 類型無法使用,要求就會失敗,您必須更新要求、指令碼或程式碼,指定「次佳」VM 類型。這個重新要求程序可能需要多次反覆操作,直到您指定可用的 VM 類型為止。

解決方案:Managed Service for Apache Spark 彈性 VM 功能會從已排序的 VM 清單中選取主要、主要和次要 worker VM 類型,然後在指定叢集區域中搜尋列出的 VM 類型可用的區域,協助您成功建立叢集。

限制

  • 使用彈性 VM 的叢集無法停止
  • 高可用性叢集中的主節點無法使用彈性 VM,但高可用性叢集工作站節點可以使用彈性 VM。

術語

  • 虛擬機器類型:虛擬機器執行個體的系列、記憶體容量和 CPU 核心數。Managed Service for Apache Spark 支援使用預先定義和自訂 VM 類型
  • 主要和主要工作節點:根據預設,Managed Service for Apache Spark 叢集有一個主要節點和兩個主要工作節點。
  • 次要工作站節點: 次要工作站不會儲存資料,僅做為處理節點。 您可以使用次要 worker 擴充運算資源,不必擴充儲存空間。彈性 VM 的預設次要工作站類型為 Spot VM,屬於先占類型。

用量

  • 在 Managed Service for Apache Spark 上,彈性 VM 適用於 Managed Service for Apache Spark 2.0.74+2.1.76+2.2.42+ 和後續的映像檔版本。 *. 從映像檔版本 3.0 開始,如果您建立叢集時未指定叢集節點的機型,Managed Service for Apache Spark 會根據彈性 VM 機型的排名清單指定節點,例如 N4、N2 和 E2 系列機型的排名清單,並根據資源可用性進行最佳化。
  • 您最多可以指定五個已排序的 VM 類型清單,每個清單最多可包含 10 個 VM 類型。
  • 您可以在工作流程範本中加入彈性 VM,在從範本建立叢集時,提供資源無法使用的復原能力。

    建議:啟用 Managed Service for Apache Spark 自動區域放置,讓 Managed Service for Apache Spark 選擇有容量可佈建所要求 VM 的區域。

  • 根據預設,叢集節點必須使用一種磁碟類型。您可以透過磁碟覆寫,為 Flex VM 叢集節點指定不同機型時,使用不同磁碟類型。

  • 雖然您可以為叢集中的主要和次要 worker 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 個 VM 類型。排名最低的名單優先順序最高。根據預設,彈性 VM 清單的等級為 0。在清單中,Managed Service for Apache Spark 會優先使用有未用預留項目的 VM 類型,其次是最大的 VM 大小。清單中 CPU 數量相同的 VM 類型會視為相同。

使用 Google Cloud 控制台、Google Cloud CLI 或 Dataproc API 建立 Managed Service for Apache Spark 叢集時,可以要求彈性 VM。

控制台

如要建立具有彈性 VM 的叢集,請執行下列操作:

  1. 開啟「建立叢集頁面。
  2. 按一下「其他設定」展開該部分。
  3. 編輯主要 worker次要 worker。 在「新增 worker 類型」下方,指定其他有排名的 VM。

gcloud

使用 gcloud dataproc clusters create 指令搭配 master-instance-selectionworker-instance-selectionsecondary-worker-instance-selection 旗標,為主要、主要和次要工作站指定已排序的彈性 VM 清單。

以下範例會要求主節點、主要和次要 VM 類型,並設定下列優先順序:

  • 如果可用,請佈建 e2-standard-8 VM (等級 0);如果 e2-standard-8 機器無法使用,請佈建 n2-standard-8 VM (等級 1)。

由於未指定次要 worker 類型,系統會佈建先占型 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
          }
        ]
      }
    }
  }
}

磁碟覆寫

您可以在彈性 VM 規格中,為每個機型 (執行個體選取項目) 指定磁碟覆寫。您可藉此自訂開機磁碟、覆寫本機 SSD,以及為特定機器類型連結額外磁碟。

磁碟覆寫選項和規則

磁碟覆寫設定選項:

  • 基本磁碟設定:為叢集節點指定的磁碟設定,例如使用 gcloud CLI --worker-boot-disk-size 旗標或 workerConfig.diskConfig.bootDiskSizeGb Dataproc API 欄位,為主要工作站指定開機磁碟大小。
  • 執行個體選取磁碟覆寫:為叢集節點指定的機器類型設定磁碟。

磁碟覆寫設定規則:

  • 基本磁碟設定:如果叢集節點的執行個體選取項目未包含 diskConfig 覆寫,您可以為節點定義基本磁碟設定。這個基本磁碟設定會套用至節點的所有執行個體選項。

  • 執行個體選取磁碟設定:如果叢集節點的執行個體選取項目包含 diskConfig 覆寫,節點群組中的所有執行個體選取項目都必須包含 diskConfig (如果您也為節點定義基礎磁碟設定,就會發生驗證錯誤)。

  • 機型相容性:單一 InstanceSelection 中的所有機型都必須與指定的 diskConfig 相容。舉例來說,您無法在同一個執行個體選取項目中,將不支援 Hyperdisk 的 e2-standard-4 機型,與需要 Hyperdisk 的 n4-standard-4 機型分組,因為 diskConfig 無法同時滿足這兩種機型。

  • 本機 SSD 支援:如果您在磁碟覆寫設定中設定本機 SSD (numLocalSsds > 0),執行個體選取畫面中的所有機型都必須支援本機 SSD。

  • 強制磁碟覆寫設定欄位:

    • 如果您為執行個體選取項目定義 diskConfig,則必須提供 bootDiskType
    • 如果您定義 attachedDiskConfigs,則每個連結的磁碟都必須有 diskTypediskSizeGb

磁碟覆寫設定範例

下列範例會為叢集節點指定下列磁碟覆寫設定選項:

  • 主節點:使用預設開機磁碟。
  • 主要 worker:根據每個執行個體選取項目使用自訂磁碟:例如 n4-standard-4 使用 hyperdisk-balanced,而 n2-standard-4 使用 pd-standard
  • 次要 worker:使用自訂基本磁碟設定: 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:
          - diskType: 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

使用 gcloud dataproc clusters create 指令,在 --worker-instance-selection 中加入內嵌 JSON diskConfig 規格:

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":[{"diskType":"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": [
                {
                  "diskType": "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
          }
        ]
      }
    }
  }
}

覆寫彈性 VM 屬性

Managed Service for Apache Spark 會在叢集層級設定屬性。建立使用彈性 VM 的叢集時,您可以覆寫主要和次要工作站彈性 VM 類型的系統產生屬性。

gcloud

如要在建立叢集時覆寫屬性,請使用 --properties 旗標,語法如下:

--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
  • ROLE 可以是 primary_workersecondary_worker
  • 如有多個資源,請以半形逗號分隔。

下列 gcloud dataproc clusters create 指令會覆寫 YARN 為次要 worker 上的 NodeManager 分配的 vCPU 數量。本範例會將所有 e2-standard-8n2-standard-8 次要 worker VM 的 yarn-site.xmlyarn.nodemanager.resource.cpu-vcores 值設為 6

gcloud dataproc clusters create CLUSTER_NAME \
    --num-workers=10 \
    --num-secondary-workers=4 \
    --worker-machine-types="type=e2-standard-8,rank=0" \
    --worker-machine-types="type=n2-standard-8,rank=1" \
    --master-machine-types="type=e2-standard-8,rank=0" \
    --master-machine-types="type=n2-standard-8,rank=1" \
    --secondary-worker-machine-types="type=e2-standard-8,rank=0" \
    --secondary-worker-machine-types="type=n2-standard-8,rank=1" \
    --region=us-central1 \
    --zone="" \
    --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_workersecondary_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"
  }
}

後續步驟