Las VMs flexibles son una función de Managed Service para Apache Spark que te permite especificar listas priorizadas de tipos de VMs para los nodos trabajadores principales, secundarios y principales de Managed Service para Apache Spark cuando creas un clúster de Managed Service para Apache Spark.
¿Por qué usar VMs flexibles?
El problema: Si un tipo de VM no está disponible cuando envías una solicitud de creación de clúster, la solicitud falla y debes actualizar la solicitud, la secuencia de comandos o el código para especificar un tipo de VM "siguiente mejor". Este proceso de volver a solicitar puede implicar varias iteraciones hasta que especifiques un tipo de VM que esté disponible.
La solución: La función de VM flexible de Managed Service para Apache Spark ayuda a que tu solicitud de creación de clústeres se realice correctamente, ya que selecciona los tipos de VM de trabajador principal y secundario de tus listas de VM clasificadas y, luego, busca zonas dentro de la región del clúster especificada con disponibilidad de los tipos de VM enumerados.
Limitaciones
- Los clústeres que usan VMs flexibles no se pueden detener.
- Los nodos principales en los clústeres de alta disponibilidad no pueden usar VMs flexibles, pero los nodos trabajadores de clústeres con alta disponibilidad sí pueden usarlas.
Terminología
- Tipo de VM: Es la familia, la capacidad de memoria y la cantidad de núcleos de CPU de una instancia de VM. Managed Service para Apache Spark admite el uso de tipos de VM predefinidos y personalizados.
- Nodos trabajadores principales y de instancia principal: De forma predeterminada, un
clúster de Managed Service para Apache Spark tiene un nodo de instancia principal y dos nodos trabajadores
principales.
- Un clúster de alta disponibilidad (HA) tiene tres nodos principales.
- Un clúster de un solo nodo tiene un nodo que actúa como nodo principal y nodo trabajador.
- Un clúster de reducción de escala a cero tiene un nodo principal y solo trabajadores secundarios (no trabajadores principales).
- Nodos trabajadores secundarios: Los trabajadores secundarios no almacenan datos y solo funcionan como nodos de procesamiento. Puedes usar trabajadores secundarios para escalar el procesamiento sin escalar el almacenamiento. El tipo de trabajador secundario de VM flexible predeterminado es una VM Spot, que es un tipo interrumpible.
Uso
- Las VMs flexibles están disponibles en Managed Service para Apache Spark en
las versiones de imagen
2.0.74+,2.1.76+,2.2.42+y posteriores de Managed Service para Apache Sparkimageversions.- A partir de la versión de imagen
3.0, cuando creas un clúster sin especificar un tipo de máquina para un nodo del clúster, Managed Service para Apache Spark especifica el nodo con una lista clasificada de tipos de máquinas de VM flexibles, como una lista clasificada de tipos de máquinas de las series N4, N2 y E2, con la lista optimizada para la disponibilidad de recursos.
- A partir de la versión de imagen
Puedes especificar hasta cinco listas de tipos de VM clasificadas, con hasta 10 tipos de VM en una lista.
Puedes incluir VMs flexibles en plantillas de flujo de trabajo para proporcionar resiliencia contra la falta de disponibilidad de recursos cuando se crean clústeres a partir de la plantilla.
Recomendación: Habilita la ubicación de zona automática de Managed Service para Apache Spark, que permite que Managed Service para Apache Spark elija una zona con la capacidad de aprovisionar las VMs solicitadas.
De forma predeterminada, un nodo de clúster debe usar un tipo de disco. Puedes usar anulaciones de disco para especificar diferentes tipos de discos para diferentes tipos de máquinas especificados para un nodo de clúster de VM flexible.
Aunque puedes especificar diferentes proporciones de CPU a memoria para los tipos de VM de trabajador principales y secundarios en un clúster, esto puede provocar una degradación del rendimiento, ya que la proporción más pequeña de CPU a memoria se usa como la unidad de contenedor más pequeña.
Si tu solicitud de creación de clúster incluye una política de ajuste de escala automático, las VMs flexibles pueden ser de diferentes familias de VM, pero deben tener la misma cantidad de memoria y de núcleos.
Los tipos de máquinas que coinciden con las reservas se seleccionan primero dentro de un rango, seguidos de los tipos de VM con la mayor cantidad de CPUs.
Managed Service para Apache Spark aplica Google Cloud cuotas al aprovisionamiento flexible de VM.
Si actualizas un clúster que se creó con VMs flexibles, Managed Service para Apache Spark selecciona y agrega trabajadores de las listas de VM flexibles que proporcionaste cuando creaste el clúster.
Cómo solicitar VMs flexibles
Puedes especificar hasta cinco listas de tipos de VM clasificadas, con hasta 10 tipos de VM en una lista. Las listas con la clasificación más baja tienen la prioridad más alta. De forma predeterminada, las listas de VM flexibles tienen un rango de 0. Dentro de una lista, Managed Service para Apache Spark prioriza los tipos de VM con reservas sin usar, seguidos de los tamaños de VM más grandes. Los tipos de VM dentro de una lista con el mismo recuento de CPU se tratan de la misma manera.
Puedes solicitar VMs flexibles cuando creas un clúster de Managed Service para Apache Spark con la consola de Google Cloud , Google Cloud CLI, la API de Dataproc, Managed Service para Apache Airflow o Terraform.
Console
Para crear un clúster con VMs flexibles, haz lo siguiente:
- Abre la página Crear clúster.
- Haz clic en Configuración adicional para expandir esa sección.
- Edita los Trabajadores principales o los Trabajadores secundarios. En Agregar tipos de trabajadores, especifica VMs clasificadas adicionales.
gcloud
Usa el
comando gcloud dataproc clusters create
con las marcas master-instance-selection, worker-instance-selection y
secondary-worker-instance-selection
para especificar listas de VM flexibles clasificadas para los trabajadores principales, secundarios y
maestros.
En el siguiente ejemplo, se solicitan tipos de VM principal, de trabajador principal y de trabajador secundario con las siguientes prioridades:
- Aprovisiona VMs
e2-standard-8si están disponibles (rango 0). Si las máquinase2-standard-8no están disponibles, aprovisiona VMsn2-standard-8(rango 1).
Como no se especifica el tipo de trabajador secundario, se aprovisionarán VMs secundarias Spot interrumpibles.
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}'
Notas:
--zone="": Establecer esta marca en un valor vacío habilita la ubicación de zona automática, lo que permite que Managed Service para Apache Spark elija una zona que tenga los tipos de VM solicitados disponibles para su uso. Este valor de marca anula cualquier selección de zona especificada en tugcloud config listpredeterminado.
API
Usa instanceFlexibilityPolicy.instanceSelectionList
como parte de una solicitud clusters.create
de la API de Dataproc
para especificar una lista clasificada de
machineTypes
para los trabajadores principales, primarios y secundarios.
Ejemplo: En el siguiente fragmento de JSON de un cuerpo de solicitud de clusters.create,
se especifican los tipos de máquinas de trabajador principal (workerConfig), trabajador secundario (secondaryWorkerConfig) y principal (masterConfig) con los rangos 0 y 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
Usa el
operador DataprocCreateClusterOperator
en un DAG de Apache Airflow para especificar instance_flexibility_policy
para los trabajadores principales, primarios y secundarios:
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
Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform. Para obtener más información, consulta la documentación de referencia del proveedor de Terraform.
Usa el recurso
google_dataproc_cluster
con bloques instance_flexibility_policy para especificar listas de VM
flexibles clasificadas:
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
}
}
}
}
}
Anulaciones de discos
Puedes especificar anulaciones de disco para cada tipo de máquina (selección de instancia) en tu especificación de VM flexible. Esto te permite personalizar los discos de arranque, anular los SSD locales y conectar discos adicionales para tipos de máquinas específicos.
Opciones y reglas de anulación de discos
Opciones de configuración de anulación de disco:
- Configuración del disco base: Es una configuración de disco especificada para un nodo del clúster, por ejemplo, especificar un tamaño de disco de arranque para los trabajadores principales con la
marca
--worker-boot-disk-sizede gcloud CLI o el campoworkerConfig.diskConfig.bootDiskSizeGbde la API de Dataproc. - Anulaciones de discos de selección de instancias: Son las configuraciones de discos para los tipos de máquinas especificados para un nodo de clúster.
Reglas de configuración de anulación de discos:
Configuración del disco base: Si ninguna selección de instancia para un nodo del clúster incluye una anulación de
diskConfig, puedes definir una configuración de disco base para el nodo. Esta configuración de disco base se aplica a todas las selecciones de instancias para el nodo.Configuraciones de disco de selección de instancias: Si una selección de instancias para un nodo de clúster incluye una anulación de
diskConfig, todas las selecciones de instancias en el grupo de nodos deben incluir undiskConfig(si también defines una configuración de disco base para el nodo, se produce un error de validación).Compatibilidad con tipos de máquinas: Todos los tipos de máquinas dentro de un solo
InstanceSelectiondeben ser compatibles con eldiskConfigespecificado. Por ejemplo, no puedes agrupar un tipo de máquinae2-standard-4, que no admite un Hyperdisk, con un tipo de máquinan4-standard-4, que requiere un Hyperdisk, en la misma selección de instancias, ya que eldiskConfigno puede satisfacer ambos tipos de máquina.Compatibilidad con SSD locales: Si configuras SSD locales (
numLocalSsds> 0) en una configuración de anulación de disco, todos los tipos de máquinas en la selección de instancias deben admitir SSD locales.Campos de configuración obligatorios para la anulación del disco:
- Si defines
diskConfigpara una selección de instancias,bootDiskTypees obligatorio. - Si defines
attachedDiskConfigs, tantotypecomodiskSizeGbson obligatorios para cada disco conectado.
- Si defines
Ejemplos de configuración de anulación de discos
En el siguiente ejemplo, se especifican las siguientes opciones de configuración de anulación de disco para los siguientes nodos del clúster:
- Nodos principales: Usa discos de arranque predeterminados.
- Trabajadores principales: Usa discos personalizados por selección de instancia: por
ejemplo,
n4-standard-4usahyperdisk-balanced, mientras quen2-standard-4usapd-standard. - Trabajadores secundarios: Usa una configuración de disco base personalizada:
pd-ssdcon200 GB, que se aplica a todas las selecciones de instancias.
YAML de gcloud
Define las políticas de VM flexibles en archivos YAML para los nodos principal, trabajador principal y trabajador secundario:
master-flex-policy.yaml:instanceFlexibilityPolicy: instanceSelectionList: - machineTypes: - e2-standard-8 rank: 0 - machineTypes: - n2-standard-8 rank: 1worker-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: 400secondary-worker-flex-policy.yaml:instanceFlexibilityPolicy: instanceSelectionList: - machineTypes: - e2-standard-8 rank: 0 - machineTypes: - n2-standard-8 rank: 1
Usa el comando gcloud dataproc clusters create
para pasar los archivos 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 de gcloud
Usa el comando gcloud dataproc clusters create
con las especificaciones de diskConfig de JSON intercaladas en --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
Usa el campo diskConfig dentro de un
instanceFlexibilityPolicy.instanceSelectionList en una solicitud clusters.create
de la API de Dataproc.
Ejemplo de cuerpo de la solicitud 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
}
]
}
}
}
}
Anula las propiedades de la VM flexible
Managed Service para Apache Spark establece propiedades a nivel del clúster. Cuando creas un clúster que usa VMs flexibles, puedes anular las propiedades generadas por el sistema para los tipos de VMs flexibles de trabajadores principales y secundarios.
gcloud
Para anular las propiedades cuando creas un clúster, usa la marca --properties
con la siguiente sintaxis:
--properties="$ROLE:$MACHINE_TYPE:$COMPONENT_PREFIX:$COMPONENT_PROPERTY=$VALUE"
- ROLE puede ser
primary_workerosecondary_worker. - Separa las propiedades con una coma.
El siguiente comando de gcloud dataproc clusters create anula la cantidad
de CPUs virtuales que YARN asigna para NodeManager en los trabajadores secundarios. En este
ejemplo, se establece el valor yarn.nodemanager.resource.cpu-vcores en
yarn-site.xml como 6 para todas las VMs de trabajador secundario
e2-standard-8 y 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 anular las propiedades, defínelas en el campo properties del objeto
SoftwareConfig
en tu solicitud de creación de clúster.
Usa la siguiente sintaxis para la clave de propiedad:
ROLE:MACHINE_TYPE:COMPONENT_PREFIX:COMPONENT_PROPERTY
- ROLE puede ser
primary_workerosecondary_worker.
El siguiente objeto SoftwareConfig anula la cantidad de CPU virtuales que
YARN asigna para NodeManager en los trabajadores secundarios. En este ejemplo, se establece el
valor de yarn.nodemanager.resource.cpu-vcores en 6 para todas las VMs de trabajador secundario
e2-standard-8 y 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"
}
}
¿Qué sigue?
- Obtén más información sobre las propiedades del clúster de Managed Service para Apache Spark.