Priorizar tipos de VM com VMs flexíveis

As VMs flexíveis são um recurso do Serviço Gerenciado para Apache Spark que permite especificar listas priorizadas de tipos de VM para nós principais, primários e secundários do Serviço Gerenciado para Apache Spark ao criar um cluster do Serviço Gerenciado para Apache Spark.

Por que usar VMs flexíveis?

O problema: se um tipo de VM não estiver disponível quando você enviar uma solicitação de criação de cluster, a solicitação falhará e será necessário atualizar a solicitação, o script ou o código para especificar um tipo de VM "melhor seguinte". Esse processo de nova solicitação pode envolver várias iterações até que você especifique um tipo de VM disponível.

A solução: o recurso de VM flexível do Serviço Gerenciado para Apache Spark ajuda a solicitação de criação de cluster a ser bem-sucedida, selecionando tipos de VM de worker principais, primários e secundários nas listas de VMs classificadas e, em seguida, pesquisando zonas na região de cluster especificada com disponibilidade dos tipos de VM listados.

Limitações

  • Não é possível interromper clusters que usam VMs flexíveis interrompidos.
  • Os nós principais em clusters de alta disponibilidade não podem usar VMs flexíveis, mas os nós de worker do cluster de alta disponibilidade podem usar VMs flexíveis.

Terminologia

  • Tipo de VM:a família, a capacidade de memória e o número de núcleos de CPU de uma instância de VM. O Serviço Gerenciado para Apache Spark oferece suporte ao uso de tipos de VM predefinidos e personalizados.
  • Nós principais e de worker primários:por padrão, um cluster do Serviço Gerenciado para Apache Spark tem um nó principal e dois nós de worker primários.
  • Nós de worker secundários: Os workers secundários não armazenam dados e funcionam apenas como nós de processamento. É possível usar workers secundários para escalonar a computação sem escalonar o armazenamento. O tipo de worker secundário de VM flexível padrão é uma VM spot, que é um tipo preemptivo.

Uso

  • As VMs flexíveis estão disponíveis no Serviço Gerenciado para Apache Spark em Serviço Gerenciado para Apache Spark 2.0.74+, 2.1.76+, 2.2.42+, e mais recentes imageversions.
    • A partir da versão de imagem 3.0, ao criar um cluster sem especificar um tipo de máquina para um nó de cluster, o Serviço Gerenciado para Apache Spark especifica o nó com uma lista classificada de tipos de máquina de VM flexíveis, como uma lista classificada de tipos de máquina das séries N4, N2 e E2, com a lista otimizada para disponibilidade de recursos.
  • É possível especificar até cinco listas de tipos de VM classificadas, com até 10 tipos de VM em uma lista.

  • É possível incluir VMs flexíveis em modelos de fluxo de trabalho para oferecer resiliência contra a indisponibilidade de recursos quando os clusters são criados a partir do modelo.

    Recomendação: ative o posicionamento automático de zona do Serviço Gerenciado para Apache Spark, que permite que o Serviço Gerenciado para Apache Spark escolha uma zona com capacidade de provisionar as VMs solicitadas.

  • Por padrão, um nó de cluster precisa usar um tipo de disco. É possível usar substituições de disco para especificar tipos de disco diferentes para tipos de máquina diferentes especificados para um nó de cluster de VM flexível.

  • Embora seja possível especificar proporções diferentes de CPU para memória para tipos de VM de worker primários e secundários em um cluster, isso pode levar à degradação do desempenho, porque a menor proporção de CPU para memória é usada como a menor unidade de contêiner.

  • Se a solicitação de criação de cluster incluir uma política de escalonamento automático, as VMs flexíveis poderão ser de famílias de VMs diferentes, mas precisarão ter a mesma quantidade de memória e contagem de núcleos.

  • Os tipos de máquina que correspondem às reservas são selecionados primeiro em uma classificação, seguidos pelos tipos de VM com o maior número de CPUs.

  • O Serviço Gerenciado para Apache Spark aplica Google Cloud quotas ao provisionamento de VMs flexíveis.

  • Se você atualizar um cluster criado usando VMs flexíveis, o Serviço Gerenciado para Apache Spark selecionará e adicionará workers das listas de VMs flexíveis fornecidas ao criar o cluster.

Como solicitar VMs flexíveis

É possível especificar até cinco listas de tipos de VM classificadas, com até 10 tipos de VM em uma lista. As listas com classificação mais baixa têm a maior prioridade. Por padrão, as listas de VMs flexíveis têm uma classificação de 0. Em uma lista, o Serviço Gerenciado para Apache Spark prioriza tipos de VM com reservas não utilizadas, seguidos pelos maiores tamanhos de VM. Os tipos de VM em uma lista com a mesma contagem de CPU são tratados igualmente.

É possível solicitar VMs flexíveis ao criar um cluster do Serviço Gerenciado para Apache Spark usando o Google Cloud console, a Google Cloud CLI, a API Dataproc, Serviço Gerenciado para Apache Airflow ou o Terraform.

Console

Para criar um cluster com VMs flexíveis, faça o seguinte:

  1. Abra a página Criar cluster.
  2. Clique em Configuração adicional para expandir essa seção.
  3. Edite Workers primários ou Workers secundários. Em Adicionar tipos de worker, especifique outras VMs classificadas.

gcloud

Use the gcloud dataproc clusters create command with master-instance-selection, worker-instance-selection and secondary-worker-instance-selection flags to specify ranked flexible VM lists for master, primary, and secondary workers.

O exemplo a seguir solicita tipos de VM principais, primários e secundários com as seguintes prioridades:

  • Provisione VMs e2-standard-8 se disponíveis (classificação 0). Se as máquinas e2-standard-8 não estiverem disponíveis, provisione VMs n2-standard-8 (classificação 1).

Como o tipo de worker secundário não está especificado, as VMs secundárias do Spot preemptivas serão provisionadas.

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

Observações:

  • --zone="": definir essa flag como um valor vazio ativa o posicionamento automático de zona, o que permite que o Serviço Gerenciado para Apache Spark escolha uma zona que tenha os tipos de VM solicitados disponíveis para uso. Esse valor de flag substitui qualquer seleção de zona especificada na gcloud config list padrão.

API

Use the instanceFlexibilityPolicy.instanceSelectionList como parte de uma solicitação clusters.create da API Dataproc para especificar uma lista classificada de machineTypes para workers principais, primários e secundários.

Exemplo: o snippet JSON a seguir de um clusters.create corpo de solicitação especifica tipos de máquina principais (masterConfig), de worker primário (workerConfig) e de worker secundário (secondaryWorkerConfig) com classificações 0 e 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

Use o DataprocCreateClusterOperator operador em um DAG do Apache Airflow para especificar instance_flexibility_policy para workers principais, primários e secundários:

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

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform. Para mais informações, consulte a Terraform documentação de referência do provedor.

Use o google_dataproc_cluster recurso com instance_flexibility_policy blocos para especificar listas de VMs flexíveis classificadas:

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

Substituições de disco

É possível especificar substituições de disco para cada tipo de máquina (seleção de instância) na especificação de VM flexível. Isso permite personalizar discos de inicialização, substituir SSDs locais e anexar discos adicionais para tipos de máquina específicos.

Opções e regras de substituição de disco

Opções de configuração de substituição de disco:

  • Configuração de disco base: uma configuração de disco especificada para um nó de cluster, por exemplo, especificar um tamanho de disco de inicialização para workers primários usando a flag --worker-boot-disk-size da CLI gcloud ou o workerConfig.diskConfig.bootDiskSizeGb campo da API Dataproc.
  • Substituições de disco de seleção de instância:configurações de disco para tipos de máquina especificados para um nó de cluster.

Regras de configuração de substituição de disco:

  • Configuração de disco base:se nenhuma seleção de instância para um nó de cluster incluir uma substituição diskConfig, será possível definir uma configuração de disco base para o nó. Essa configuração de disco base é aplicada a todas as seleções de instância do nó.

  • Configurações de disco de seleção de instância:se uma seleção de instância para um nó de cluster incluir uma substituição diskConfig, todas as seleções de instância no grupo de nós precisarão incluir um diskConfig. Se você também definir uma configuração de disco base para o nó, ocorrerá um erro de validação.

  • Compatibilidade de tipo de máquina:todos os tipos de máquina em uma única InstanceSelection precisam ser compatíveis com o diskConfig especificado. Por exemplo, não é possível agrupar um tipo de máquina e2-standard-4, que não oferece suporte a um hiperdisco, com um tipo de máquina n4-standard-4, que exige um hiperdisco, na mesma seleção de instância, já que o diskConfig não pode atender aos dois tipos de máquina.

  • Suporte a SSD local:se você configurar SSDs locais (numLocalSsds > 0) em uma configuração de substituição de disco, todos os tipos de máquina na seleção de instância precisarão oferecer suporte a SSDs locais.

  • Campos de configuração de substituição de disco obrigatórios :

    • Se você definir diskConfig para uma seleção de instância, bootDiskType será obrigatório.
    • Se você definir attachedDiskConfigs, type e diskSizeGb serão obrigatórios para cada disco anexado.

Exemplos de configuração de substituição de disco

O exemplo a seguir especifica as seguintes opções de configuração de substituição de disco para os seguintes nós de cluster:

  • Nós principais:use discos de inicialização padrão.
  • Workers primários : use discos personalizados por seleção de instância. Por exemplo, n4-standard-4 usa hyperdisk-balanced, enquanto n2-standard-4 usa pd-standard.
  • Workers secundários:use uma configuração de disco base personalizada: pd-ssd com 200 GB, que é aplicada a todas as seleções de instância.

YAML da gcloud

Defina as políticas de VM flexíveis em arquivos YAML para nós principais, de worker primário e de worker secundário:

  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

Use o gcloud dataproc clusters create comando para transmitir os arquivos de política:

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

JSON da gcloud

Use o gcloud dataproc clusters create comando com especificações JSON diskConfig embutidas em --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

Use o campo diskConfig em um instanceFlexibilityPolicy.instanceSelectionList em uma solicitação clusters.create da API Dataproc.

Exemplo de corpo da solicitação 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
          }
        ]
      }
    }
  }
}

Substituir propriedades de VM flexível

O Serviço Gerenciado para Apache Spark define propriedades no nível do cluster. Ao criar um cluster que usa VMs flexíveis, é possível substituir as propriedades geradas pelo sistema para tipos de VM flexíveis de worker primários e secundários.

gcloud

Para substituir propriedades ao criar um cluster, use a flag --properties com a seguinte sintaxe:

--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
  • ROLE pode ser primary_worker ou secondary_worker.
  • Separe várias propriedades com uma vírgula.

O comando gcloud dataproc clusters create a seguir substitui o número de vCPUs que o YARN aloca para o NodeManager em workers secundários. Este exemplo define o valor yarn.nodemanager.resource.cpu-vcores em yarn-site.xml como 6 para todas as VMs de worker secundárias 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

Para substituir propriedades, defina-as no campo properties do SoftwareConfig objeto na solicitação de criação de cluster.

Use a seguinte sintaxe para a chave de propriedade:

ROLE:MACHINE_TYPE:COMPONENT_PREFIX:COMPONENT_PROPERTY
  • ROLE pode ser primary_worker ou secondary_worker.

O objeto SoftwareConfig a seguir substitui o número de vCPUs que o YARN aloca para o NodeManager em workers secundários. Este exemplo define o valor yarn.nodemanager.resource.cpu-vcores como 6 para todas as VMs de worker secundárias 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"
  }
}

A seguir