Prioriser les types de VM avec les VM flexibles

Les VM flexibles sont une fonctionnalité de Managed Service pour Apache Spark qui vous permet de spécifier des listes hiérarchisées de types de VM pour les nœuds de calcul maître, principal et secondaire de Managed Service pour Apache Spark lorsque vous créez un cluster Managed Service pour Apache Spark.

Pourquoi utiliser des VM flexibles ?

Le problème : si un type de VM n'est pas disponible lorsque vous envoyez une requête de création de cluster, la requête échoue et vous devez mettre à jour votre requête, votre script ou votre code pour spécifier un type de VM "optimal". Ce processus de nouvelle demande peut impliquer plusieurs itérations jusqu'à ce que vous spécifiiez un type de VM disponible.

La solution : la fonctionnalité de VM flexible de Managed Service pour Apache Spark permet de répondre à votre demande de création de cluster en sélectionnant des types de VM de nœud de calcul maître, principal et secondaire dans vos listes de VM classées, puis en recherchant des zones dans la région de cluster spécifiée où les types de VM listés sont disponibles.

Limites

  • Les clusters qui utilisent des VM flexibles ne peuvent pas être arrêtés.
  • Les nœuds maîtres des clusters à haute disponibilité ne peuvent pas utiliser de VM flexibles, mais les nœuds de calcul des clusters à haute disponibilité le peuvent.

Terminologie

  • Type de VM : famille, capacité de mémoire et nombre de cœurs de processeur d'une instance de VM. Managed Service pour Apache Spark est compatible avec l'utilisation de types de VM prédéfinis et personnalisés.
  • Nœuds de calcul principaux et maîtres : par défaut, un cluster Managed Service pour Apache Spark comporte un nœud maître et deux nœuds de calcul principaux.
  • Nœuds de calcul secondaires : les nœuds de calcul secondaires ne stockent pas de données et fonctionnent uniquement comme des nœuds de traitement. Vous pouvez utiliser des nœuds de calcul secondaires pour faire évoluer les ressources de calcul sans faire évoluer le stockage. Le type de nœud de calcul secondaire de VM flexible par défaut est une VM Spot, qui est un type préemptif.

Utilisation

  • Les VM flexibles sont disponibles dans Managed Service pour Apache Spark sur les imageversions 2.0.74+, 2.1.76+, 2.2.42+ et ultérieures de Managed Service pour Apache Spark.
    • À partir de la version d'image 3.0, lorsque vous créez un cluster sans spécifier de type de machine pour un nœud de cluster, Managed Service pour Apache Spark spécifie le nœud avec une liste classée de types de machines de VM flexibles, comme une liste classée de types de machines des séries N4, N2 et E2, la liste étant optimisée pour la disponibilité des ressources.
  • Vous pouvez spécifier jusqu'à cinq listes de types de VM classées, avec jusqu'à 10 types de VM par liste.

  • Vous pouvez inclure des VM flexibles dans des modèles de workflow pour assurer la résilience contre l'indisponibilité des ressources lorsque des clusters sont créés à partir du modèle.

    Recommandation : Activez l'emplacement de zone automatique Managed Service pour Apache Spark, qui permet à Managed Service pour Apache Spark de choisir une zone disposant de la capacité nécessaire pour provisionner les VM demandées.

  • Par défaut, un nœud de cluster doit utiliser un seul type de disque. Vous pouvez utiliser des remplacements de disque pour spécifier différents types de disques pour différents types de machines spécifiés pour un nœud de cluster de VM Flex.

  • Bien que vous puissiez spécifier différents ratios processeur/mémoire pour les types de VM de nœuds de calcul principaux et secondaires d'un cluster, cela peut entraîner une dégradation des performances, car le ratio processeur/mémoire le plus faible est utilisé comme plus petite unité de conteneur.

  • Si votre requête de création de cluster inclut une règle d'autoscaling, les VM flexibles peuvent appartenir à différentes familles de VM, mais elles doivent avoir la même quantité de mémoire et le même nombre de cœurs.

  • Les types de machines qui correspondent aux réservations sont d'abord sélectionnés dans un rang, suivis des types de VM avec le plus grand nombre de processeurs.

  • Managed Service pour Apache Spark applique des quotas Google Cloud au provisionnement flexible des VM.

  • Si vous mettez à jour un cluster créé à l'aide de VM flexibles, Managed Service pour Apache Spark sélectionne et ajoute des nœuds de calcul à partir des listes de VM flexibles que vous avez fournies lors de la création de votre cluster.

Demander des VM flexibles

Vous pouvez spécifier jusqu'à cinq listes de types de VM classées, avec jusqu'à 10 types de VM par liste. Les listes les moins bien classées ont la priorité la plus élevée. Par défaut, les listes de VM flexibles ont un rang de 0. Dans une liste, Managed Service pour Apache Spark donne la priorité aux types de VM avec des réservations inutilisées, suivis des plus grandes tailles de VM. Les types de VM d'une liste ayant le même nombre de processeurs sont traités de la même manière.

Vous pouvez demander des VM flexibles lorsque vous créez un cluster Managed Service pour Apache Spark à l'aide de la console Google Cloud , de la Google Cloud CLI, de l'API Dataproc, de Managed Service pour Apache Airflow ou de Terraform.

Console

Pour créer un cluster avec des VM flexibles, procédez comme suit :

  1. Ouvrez la page Créer un cluster.
  2. Cliquez sur Configuration supplémentaire pour développer cette section.
  3. Modifiez les nœuds de calcul principaux ou les nœuds de calcul secondaires. Sous Ajouter des types de nœuds de calcul, spécifiez des VM classées supplémentaires.

gcloud

Utilisez la commande gcloud dataproc clusters create avec les options master-instance-selection, worker-instance-selection et secondary-worker-instance-selection pour spécifier des listes de VM flexibles classées pour les nœuds de calcul maîtres, principaux et secondaires.

L'exemple suivant demande des types de VM maître, principale et secondaire avec les priorités suivantes :

  • Provisionner des VM e2-standard-8 si elles sont disponibles (rang 0). Si les machines e2-standard-8 ne sont pas disponibles, provisionner des VM n2-standard-8 (rang 1).

Étant donné que le type de nœud de calcul secondaire n'est pas spécifié, des VM Spot secondaires préemptives seront provisionnées.

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

Remarques :

  • --zone="" : définir cette option sur une valeur vide active l'emplacement de zone automatique, ce qui permet à Managed Service pour Apache Spark de choisir une zone dans laquelle les types de VM demandés sont disponibles. Cette valeur d'option remplace toute sélection de zone spécifiée dans votre gcloud config list par défaut.

API

Utilisez instanceFlexibilityPolicy.instanceSelectionList dans une requête clusters.create de l'API Dataproc pour spécifier une liste classée de machineTypes pour les nœuds de calcul maîtres, principaux et secondaires.

Exemple : L'extrait JSON suivant d'un corps de requête clusters.create spécifie les types de machines maître (masterConfig), nœud de calcul principal (workerConfig) et nœud de calcul secondaire (secondaryWorkerConfig) avec les rangs 0 et 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

Utilisez l'opérateur DataprocCreateClusterOperator dans un DAG Apache Airflow pour spécifier instance_flexibility_policy pour les nœuds de calcul maître, principaux et secondaires :

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

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez Commandes Terraform de base. Pour en savoir plus, lisez la documentation de référence du fournisseur Terraform.

Utilisez la ressource google_dataproc_cluster avec des blocs instance_flexibility_policy pour spécifier des listes de VM flexibles classées :

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

Remplacements de disque

Vous pouvez spécifier des remplacements de disque pour chaque type de machine (sélection d'instance) dans votre spécification de VM flexible. Cela vous permet de personnaliser les disques de démarrage, de remplacer les disques SSD locaux et d'associer des disques supplémentaires pour des types de machines spécifiques.

Options et règles de remplacement de disque

Options de configuration du remplacement de disque :

  • Configuration de disque de base : configuration de disque spécifiée pour un nœud de cluster, par exemple, en spécifiant une taille de disque de démarrage pour les nœuds de calcul principaux à l'aide de l'option gcloud CLI --worker-boot-disk-size ou du champ d'API Dataproc workerConfig.diskConfig.bootDiskSizeGb.
  • Remplacements de disque de sélection d'instance : configurations de disque pour les types de machines spécifiés pour un nœud de cluster.

Règles de configuration du remplacement de disque :

  • Configuration du disque de base : si aucune sélection d'instance pour un nœud de cluster n'inclut de remplacement diskConfig, vous pouvez définir une configuration de disque de base pour le nœud. Cette configuration de disque de base est appliquée à toutes les sélections d'instances pour le nœud.

  • Configurations de disque de sélection d'instance : si une sélection d'instance pour un nœud de cluster inclut un remplacement diskConfig, toutes les sélections d'instance du groupe de nœuds doivent inclure un diskConfig (si vous définissez également une configuration de disque de base pour le nœud, une erreur de validation se produit).

  • Compatibilité des types de machines : tous les types de machines d'un même InstanceSelection doivent être compatibles avec le diskConfig spécifié. Par exemple, vous ne pouvez pas regrouper un type de machine e2-standard-4, qui n'est pas compatible avec un hyperdisque, avec un type de machine n4-standard-4, qui nécessite un hyperdisque, dans la même sélection d'instances, car le diskConfig ne peut pas satisfaire les deux types de machines.

  • Compatibilité avec les disques SSD locaux : si vous configurez des disques SSD locaux (numLocalSsds > 0) dans une configuration de remplacement de disque, tous les types de machines de la sélection d'instances doivent être compatibles avec les disques SSD locaux.

  • Champs de configuration obligatoires pour le remplacement de disque :

    • Si vous définissez diskConfig pour une sélection d'instances, bootDiskType est obligatoire.
    • Si vous définissez attachedDiskConfigs, type et diskSizeGb sont obligatoires pour chaque disque associé.

Exemples de configuration de remplacement de disque

L'exemple suivant spécifie les options de configuration de remplacement de disque suivantes pour les nœuds de cluster suivants :

  • Nœuds maîtres : utilisez les disques de démarrage par défaut.
  • Nœuds de calcul principaux : utilisez des disques personnalisés par sélection d'instance. Par exemple, n4-standard-4 utilise hyperdisk-balanced, tandis que n2-standard-4 utilise pd-standard.
  • Nœuds de calcul secondaires : utilisez une configuration de disque de base personnalisée : pd-ssd avec 200 GB, qui est appliquée à toutes les sélections d'instances.

gcloud YAML

Définissez les règles de VM flexibles dans des fichiers YAML pour les nœuds maîtres, les nœuds de calcul principaux et les nœuds de calcul secondaires :

  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

Utilisez la commande gcloud dataproc clusters create pour transmettre les fichiers de stratégie :

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

Utilisez la commande gcloud dataproc clusters create avec les spécifications JSON diskConfig intégrées dans --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

Utilisez le champ diskConfig dans un instanceFlexibilityPolicy.instanceSelectionList d'une requête clusters.create de l'API Dataproc.

Exemple de corps de requête 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
          }
        ]
      }
    }
  }
}

Remplacer les propriétés des VM Flex

Managed Service pour Apache Spark définit les propriétés au niveau du cluster. Lorsque vous créez un cluster qui utilise des VM flexibles, vous pouvez remplacer les propriétés générées par le système pour les types de VM flexibles des nœuds de calcul principaux et secondaires.

gcloud

Pour remplacer des propriétés lorsque vous créez un cluster, utilisez l'option --properties avec la syntaxe suivante :

--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
  • ROLE peut être primary_worker ou secondary_worker.
  • Séparez les différentes propriétés par une virgule.

La commande gcloud dataproc clusters create suivante remplace le nombre de processeurs virtuels que YARN alloue à NodeManager sur les nœuds de calcul secondaires. Cet exemple définit la valeur yarn.nodemanager.resource.cpu-vcores dans yarn-site.xml sur 6 pour toutes les VM de nœuds de calcul secondaires e2-standard-8 et 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

Pour remplacer des propriétés, définissez-les dans le champ properties de l'objet SoftwareConfig dans votre requête de création de cluster.

Utilisez la syntaxe suivante pour la clé de propriété :

ROLE:MACHINE_TYPE:COMPONENT_PREFIX:COMPONENT_PROPERTY
  • ROLE peut être primary_worker ou secondary_worker.

L'objet SoftwareConfig suivant remplace le nombre de processeurs virtuels que YARN alloue à NodeManager sur les nœuds de calcul secondaires. Cet exemple définit la valeur yarn.nodemanager.resource.cpu-vcores sur 6 pour toutes les VM de nœud de calcul secondaires e2-standard-8 et 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"
  }
}

Étapes suivantes