Ajuste de escala automático de Serverless para Apache Spark

En este documento, se proporciona información sobre Google Cloud el ajuste de escala automático de Serverless for Apache Spark. Cuando envías tu carga de trabajo de Spark, Serverless for Apache Spark puede ajustar de forma dinámica la escala de los recursos de la carga de trabajo, como la cantidad de ejecutores, para ejecutarla de manera eficaz. El ajuste de escala automático de Serverless for Apache Spark es el comportamiento predeterminado y usa la asignación dinámica de recursos de Spark para determinar si se debe ajustar la escala de tu carga de trabajo, cómo y cuándo.

Ajuste de escala automático de Serverless for Apache Spark V2

La versión 2 (V2) del ajuste de escala automático de Serverless for Apache Spark agrega funciones y mejoras a la versión 1 (V1) predeterminada para ayudarte a administrar las cargas de trabajo de Serverless for Apache Spark, mejorar el rendimiento de las cargas de trabajo y ahorrar costos:

  • Reducción de escala asíncrona de nodos: El ajuste de escala automático V2 reemplaza la reducción de escala síncrona de V1 por una asíncrona. Con la reducción de escala asíncrona, Serverless for Apache Spark reduce la escala de los recursos de la carga de trabajo sin esperar a que todos los nodos finalicen la migración de ordenamiento aleatorio. Esto significa que los nodos de cola larga que se reducen lentamente no bloquearán el aumento de escala.
  • Selección inteligente de nodos para la reducción de escala: El ajuste de escala automático V2 reemplaza la selección aleatoria de nodos de V1 por un algoritmo inteligente que identifica los mejores nodos para reducir la escala primero. Este algoritmo considera factores como el tamaño de los datos de ordenamiento aleatorio del nodo y el tiempo de inactividad.
  • Retiro de servicio ordenado y comportamiento de migración de ordenamiento aleatorio de Spark configurables: El ajuste de escala automático V2 te permite usar propiedades estándar de Spark para configurar el retiro de servicio ordenado y la migración de ordenamiento aleatorio de Spark. Esta función puede ayudar te a mantener la compatibilidad de la migración con tus propiedades de Spark personalizadas.

Funciones de ajuste de escala automático de Serverless for Apache Spark

Función Ajuste de escala automático de Serverless for Apache Spark V1 Ajuste de escala automático de Serverless for Apache Spark V2
Reducción de escala de nodos Síncrona Asíncrona
Selección de nodos para la reducción de escala Aleatorio Inteligente
Retiro de servicio ordenado y migración de ordenamiento aleatorio de Spark No configurable Configurable

Propiedades de asignación dinámica de Spark

En la siguiente tabla, se enumeran las propiedades de asignación dinámica de Spark que puedes establecer cuando envías una carga de trabajo por lotes para controlar el ajuste de escala automático (consulta cómo establecer propiedades de Spark).

Propiedad Descripción Predeterminada
spark.dataproc.scaling.version La versión del ajuste de escala automático de Spark de Serverless for Apache Spark. Especifica versión 1 o 2 (consulta Ajuste de escala automático de Serverless for Apache Spark V2). 1
spark.dynamicAllocation.enabled Indica si se debe usar la asignación dinámica de recursos, que aumenta y disminuye la cantidad de ejecutores según la carga de trabajo. Si se establece el valor en false, se inhabilita el ajuste de escala automático para la carga de trabajo. Valor predeterminado: true. true
spark.dynamicAllocation.initialExecutors La cantidad inicial de ejecutores asignados a la carga de trabajo. Después de que se inicia la carga de trabajo, el ajuste de escala automático puede cambiar la cantidad de ejecutores activos. El valor mínimo es 2 y el valor máximo es 2000. 2
spark.dynamicAllocation.minExecutors La cantidad mínima de ejecutores a la que se debe reducir la escala de la carga de trabajo. El valor mínimo es 2. 2
spark.dynamicAllocation.maxExecutors La cantidad máxima de ejecutores a la que se debe aumentar la escala de la carga de trabajo. El valor máximo es 2000. 1000
spark.dynamicAllocation.executorAllocationRatio Personaliza el aumento de escala de la carga de trabajo de Spark. Acepta un valor de 0 a 1. Un valor de 1.0 proporciona la capacidad máxima de aumento de escala y ayuda a lograr el paralelismo máximo. Un valor de 0.5 establece la capacidad de aumento de escala y el paralelismo en la mitad del valor máximo. 0.3
spark.reducer.fetchMigratedShuffle.enabled Cuando se establece en true, permite recuperar la ubicación de salida de ordenamiento aleatorio del controlador de Spark después de que falla una recuperación de un ejecutor que se retiró debido a la asignación dinámica de Spark. Esto reduce ExecutorDeadException errores causados por la migración de bloques de ordenamiento aleatorio de ejecutores retirados a ejecutores activos y reduce los reintentos de etapa causados por FetchFailedException errores (consulta FetchFailedException causada por ExecutorDeadException). Esta propiedad está disponible en las versiones del entorno de ejecución de Spark de Serverless for Apache Spark 1.1.12 y posteriores, y 2.0.20 y posteriores. false

Métricas de asignación dinámica de Spark

Las cargas de trabajo por lotes de Spark generan las siguientes métricas relacionadas con la asignación dinámica de recursos de Spark (para obtener información adicional sobre las métricas de Spark, consulta Supervisión y generación de registros).

Métrica Descripción
maximum-needed La cantidad máxima de ejecutores necesarios en la carga actual para satisfacer todas las tareas en ejecución y pendientes.
running La cantidad de ejecutores en ejecución que ejecutan tareas.

Problemas y soluciones de asignación dinámica de Spark

  • FetchFailedException causada por ExecutorDeadException

    Causa: Cuando la asignación dinámica de Spark reduce la escala de un ejecutor, el archivo de ordenamiento aleatorio se migra a ejecutores activos. Sin embargo, dado que la tarea de reducción de Spark en un ejecutor recupera la salida de ordenamiento aleatorio de la ubicación establecida por el controlador de Spark cuando se inició la tarea de reducción, si se migra un archivo de ordenamiento aleatorio, el reductor puede seguir intentando recuperar la salida de ordenamiento aleatorio de un ejecutor retirado, lo que causa errores ExecutorDeadException y FetchFailedException.

    Solución: Habilita la recuperación de la ubicación de ordenamiento aleatorio estableciendo spark.reducer.fetchMigratedShuffle.enabled en true cuando ejecutes tu carga de trabajo por lotes de Serverless for Apache Spark (consulta Establece propiedades de cargas de trabajo por lotes de Spark). Cuando esta propiedad está habilitada, la tarea de reducción recupera la ubicación de salida de ordenamiento aleatorio del controlador después de que falla una recuperación de un ejecutor retirado.