Dai la priorità ai tipi di VM con le VM flessibili

Le VM flessibili sono una funzionalità di Managed Service for Apache Spark che ti consente di specificare elenchi prioritari di tipi di VM per i nodi master, worker primari e secondari di Managed Service for Apache Spark quando crei un cluster Managed Service for Apache Spark.

Perché utilizzare VM flessibili?

Il problema: se un tipo di VM non è disponibile quando invii una richiesta di creazione del cluster, la richiesta non va a buon fine e devi aggiornare la richiesta, lo script o il codice per specificare un tipo di VM "migliore successivo". Questa procedura di nuova richiesta può comportare più iterazioni finché non specifichi un tipo di VM disponibile.

La soluzione: la funzionalità VM flessibili di Managed Service for Apache Spark consente di soddisfare la richiesta di creazione del cluster selezionando i tipi di VM master, VM worker primarie e secondarie dagli elenchi di VM classificati e cercando le zone all'interno della regione del cluster specificata con la disponibilità dei tipi di VM elencati.

Limitazioni

  • I cluster che utilizzano VM flessibili non possono essere arrestati.
  • I nodi master nei cluster ad alta affidabilità non possono utilizzare VM flessibili, ma i nodi worker del cluster HA possono utilizzare VM flessibili.

Terminologia

  • Tipo di VM:la famiglia, la capacità di memoria e il numero di core CPU di un'istanza VM. Managed Service for Apache Spark supporta l'utilizzo di tipi di VM predefiniti e personalizzati.
  • Nodi master e worker principali:per impostazione predefinita, un cluster Managed Service for Apache Spark ha un nodo master e due nodi worker principali.
  • Nodi worker secondari: i worker secondari non archiviano dati e funzionano solo come nodi di elaborazione. Puoi utilizzare i worker secondari per scalare il calcolo senza scalare l'archiviazione. Il tipo di worker secondario predefinito della VM flessibile è una VM spot, che è un tipo prerilasciabile.

Utilizzo

  • Le VM flessibili sono disponibili in Managed Service for Apache Spark su Managed Service for Apache Spark 2.0.74+, 2.1.76+, 2.2.42+ e versioni successive imageversions.
    • A partire dalla versione immagine 3.0, quando crei un cluster senza specificare un tipo di macchina per un nodo del cluster, Managed Service for Apache Spark specifica il nodo con un elenco classificato di tipi di macchina VM flessibili, ad esempio un elenco classificato di tipi di macchina delle serie N4, N2 ed E2, con l'elenco ottimizzato per la disponibilità delle risorse.
  • Puoi specificare fino a cinque elenchi di tipi di VM classificati, con un massimo di 10 tipi di VM in un elenco.

  • Puoi includere le VM flessibili nei modelli di workflow per garantire la resilienza alla mancata disponibilità delle risorse quando i cluster vengono creati dal modello.

    Consiglio:attiva il posizionamento automatico delle zone di Managed Service for Apache Spark, che consente a Managed Service for Apache Spark di scegliere una zona con la capacità di eseguire il provisioning delle VM richieste.

  • Per impostazione predefinita, un nodo del cluster deve utilizzare un solo tipo di disco. Puoi utilizzare gli override del disco per specificare diversi tipi di disco per diversi tipi di macchina specificati per un nodo del cluster VM flessibile.

  • Sebbene sia possibile specificare rapporti CPU/memoria diversi per i tipi di VM worker primari e secondari in un cluster, ciò può comportare un peggioramento delle prestazioni perché il rapporto CPU/memoria più piccolo viene utilizzato come unità di container più piccola.

  • Se la tua richiesta di creazione del cluster include un'policy di scalabilità automatica, le VM flessibili possono appartenere a famiglie di VM diverse, ma devono avere la stessa quantità di memoria e lo stesso numero di core.

  • I tipi di macchine che corrispondono alle prenotazioni vengono selezionati per primi all'interno di un ranking, seguiti dai tipi di VM con il maggior numero di CPU.

  • Managed Service for Apache Spark applica Google Cloud quote al provisioning flessibile delle VM.

  • Se aggiorni un cluster creato utilizzando le VM flessibili, Managed Service for Apache Spark seleziona e aggiunge i worker dagli elenchi di VM flessibili che hai fornito quando hai creato il cluster.

Come richiedere VM flessibili

Puoi specificare fino a cinque elenchi di tipi di VM classificati, con un massimo di 10 tipi di VM in un elenco. Gli elenchi con il ranking più basso hanno la priorità più alta. Per impostazione predefinita, gli elenchi di VM flessibili hanno un rango pari a 0. All'interno di un elenco, Managed Service for Apache Spark dà la priorità ai tipi di VM con prenotazioni inutilizzate, seguiti dalle dimensioni di VM più grandi. I tipi di VM all'interno di un elenco con lo stesso numero di CPU vengono trattati allo stesso modo.

Puoi richiedere VM flessibili quando crei un cluster Managed Service for Apache Spark utilizzando la console Google Cloud , Google Cloud CLI, l'API Dataproc, Managed Service for Apache Airflow o Terraform.

Console

Per creare un cluster con VM flessibili, segui questi passaggi:

  1. Apri la pagina Crea cluster.
  2. Fai clic su Configurazione aggiuntiva per espandere la sezione.
  3. Modifica Worker principali o Worker secondari. In Aggiungi tipi di worker, specifica altre VM classificate.

gcloud

Utilizza il comando gcloud dataproc clusters create con i flag master-instance-selection, worker-instance-selection e secondary-worker-instance-selection per specificare elenchi di VM flessibili classificati per i worker master, primari e secondari.

L'esempio seguente richiede i tipi di VM master, primaria e secondaria con le seguenti priorità:

  • Esegui il provisioning di e2-standard-8 VM, se disponibili (ranking 0). Se le macchine e2-standard-8 non sono disponibili, esegui il provisioning di n2-standard-8 VM (ranking 1).

Poiché il tipo di worker secondario non è specificato, verranno sottoposte a provisioning VM secondarie spot prerilasciabili.

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}'

Note:

  • --zone="": se imposti questo flag su un valore vuoto, viene attivato il posizionamento automatico delle zone, che consente a Managed Service for Apache Spark di scegliere una zona in cui sono disponibili i tipi di VM richiesti. Questo valore del flag sostituisce qualsiasi selezione di zona specificata nel gcloud config list predefinito.

API

Utilizza instanceFlexibilityPolicy.instanceSelectionList nell'ambito di una richiesta clusters.create dell'API Dataproc per specificare un elenco classificato di machineTypes per i worker master, primari e secondari.

Esempio: il seguente snippet JSON di un clusters.create corpo della richiesta specifica i tipi di macchina master (masterConfig), worker primario (workerConfig) e worker secondario (secondaryWorkerConfig) con rango 0 e rango 1.

{
  "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

Utilizza l'operatore DataprocCreateClusterOperator in un DAG di Apache Airflow per specificare instance_flexibility_policy per i worker master, primari e secondari:

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

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base. Per saperne di più, consulta la documentazione di riferimento del fornitore Terraform.

Utilizza la risorsa google_dataproc_cluster con blocchi instance_flexibility_policy per specificare elenchi di VM flessibili classificati:

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
        }
      }
    }
  }
}

Override dischi

Puoi specificare gli override del disco per ogni tipo di macchina (selezione dell'istanza) nella specifica della VM flessibile. In questo modo puoi personalizzare i dischi di avvio, ignorare gli SSD locali e collegare dischi aggiuntivi per tipi di macchine specifici.

Opzioni e regole di override dei dischi

Opzioni di configurazione dell'override dischi:

  • Configurazione del disco di base:una configurazione del disco specificata per un nodo del cluster, ad esempio la specifica di una dimensione del disco di avvio per i worker primari utilizzando il flag --worker-boot-disk-size gcloud CLI o il campo workerConfig.diskConfig.bootDiskSizeGb dell'API Dataproc.
  • Override del disco di selezione dell'istanza:configurazioni del disco per i tipi di macchina specificati per un nodo del cluster.

Regole di configurazione dell'override dei dischi:

  • Configurazione del disco di base:se nessuna selezione dell'istanza per un nodo del cluster include un override diskConfig, puoi definire una configurazione del disco di base per il nodo. Questa configurazione del disco di base viene applicata a tutte le selezioni di istanze per il nodo.

  • Configurazioni del disco di selezione dell'istanza:se una selezione dell'istanza per un nodo del cluster include un override diskConfig, tutte le selezioni dell'istanza nel gruppo di nodi devono includere un diskConfig (se definisci anche una configurazione del disco di base per il nodo, si verifica un errore di convalida).

  • Compatibilità del tipo di macchina:tutti i tipi di macchina all'interno di un singolo InstanceSelection devono essere compatibili con il diskConfig specificato. Ad esempio, non puoi raggruppare un tipo di macchina e2-standard-4, che non supporta un hyperdisk, con un tipo di macchina n4-standard-4, che richiede un hyperdisk, nella stessa selezione di istanze, poiché diskConfig non può soddisfare entrambi i tipi di macchina.

  • Supporto SSD locale:se configuri SSD locali (numLocalSsds > 0) in una configurazione di override del disco, tutti i tipi di macchine nella selezione delle istanze devono supportare gli SSD locali.

  • Campi di configurazione per l'override del disco obbligatorio:

    • Se definisci diskConfig per una selezione di istanze, bootDiskType è obbligatorio.
    • Se definisci attachedDiskConfigs, sia type che diskSizeGb sono obbligatori per ogni disco collegato.

Esempi di configurazione dell'override dei dischi

L'esempio seguente specifica le seguenti opzioni di configurazione di override del disco per i seguenti nodi del cluster:

  • Nodi master:utilizza i dischi di avvio predefiniti.
  • Worker principali: utilizza dischi personalizzati per la selezione di istanze. Ad esempio, n4-standard-4 utilizza hyperdisk-balanced, mentre n2-standard-4 utilizza pd-standard.
  • Worker secondari:utilizza una configurazione del disco di base personalizzata: pd-ssd con 200 GB, che viene applicata a tutte le selezioni di istanze.

YAML gcloud

Definisci i criteri delle VM flessibili nei file YAML per i nodi master, worker primario e worker secondario:

  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

Utilizza il comando gcloud dataproc clusters create per trasferire i file delle policy:

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

Utilizza il comando gcloud dataproc clusters create con le specifiche JSON inline diskConfig in --worker-instance-selection:

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

Utilizza il campo diskConfig all'interno di un instanceFlexibilityPolicy.instanceSelectionList in una richiesta clusters.create dell'API Dataproc.

Esempio di corpo della richiesta 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
          }
        ]
      }
    }
  }
}

Eseguire l'override delle proprietà della VM flessibile

Managed Service for Apache Spark imposta le proprietà a livello di cluster. Quando crei un cluster che utilizza VM flessibili, puoi eseguire l'override delle proprietà generate dal sistema per i tipi di VM flessibili dei worker primari e secondari.

gcloud

Per eseguire l'override delle proprietà durante la creazione di un cluster, utilizza il flag --properties con la seguente sintassi:

--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
  • ROLE può essere primary_worker o secondary_worker.
  • Separa più proprietà con una virgola.

Il seguente comando gcloud dataproc clusters create esegue l'override del numero di vCPU che YARN alloca per NodeManager sui worker secondari. Questo esempio imposta il valore yarn.nodemanager.resource.cpu-vcores in yarn-site.xml su 6 per tutte le VM worker secondarie e2-standard-8 e n2-standard-8.

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

Per sostituire le proprietà, definiscile nel campo properties dell'oggetto SoftwareConfig nella richiesta di creazione del cluster.

Utilizza la seguente sintassi per la chiave della proprietà:

ROLE:MACHINE_TYPE:COMPONENT_PREFIX:COMPONENT_PROPERTY
  • ROLE può essere primary_worker o secondary_worker.

Il seguente oggetto SoftwareConfig sostituisce il numero di vCPU che YARN alloca per NodeManager sui worker secondari. Questo esempio imposta il valore yarn.nodemanager.resource.cpu-vcores su 6 per tutte le VM worker secondarie e2-standard-8 e n2-standard-8.

{
  "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"
  }
}

Passaggi successivi