En este documento, se proporciona información sobre el ajuste de escala automático de Managed Service para Apache Spark. Cuando envías tu carga de trabajo de Spark, Managed Service para Apache Spark puede ajustar de forma dinámica los recursos de la carga de trabajo, como la cantidad de ejecutores, para ejecutarla de manera eficiente. El ajuste de escala automático de Managed Service para 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 hacerlo.
Managed Service para Apache Spark con ajuste de escala automático V2
La versión 2 (V2) del ajuste de escala automático de Managed Service para Apache Spark agrega funciones y mejoras a la versión 1 (V1) predeterminada para ayudarte a administrar las cargas de trabajo de Managed Service para 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, Managed Service para Apache Spark reduce 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 las 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 ayudarte a mantener la compatibilidad de la migración con tus propiedades de Spark personalizadas.
Funciones de ajuste de escala automático de Managed Service para Apache Spark
| Función | Ajuste de escala automático V1 de Managed Service para Apache Spark | Ajuste de escala automático V2 de Managed Service para Apache Spark |
| 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 las propiedades de Spark).
| Propiedad | Descripción | Predeterminado |
|---|---|---|
spark.dataproc.scaling.version |
La versión de ajuste de escala automático de Managed Service para Apache Spark. Especifica
versión 1 o 2. |
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 estableces el valor en false, se inhabilita el ajuste de escala automático
para la carga de trabajo. 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.dynamicAllocation.diagnosis.enabled |
Cuando es true, se registra información de diagnóstico si los ejecutores en ejecución superan los ejecutores máximos necesarios
para el período especificado por spark.dynamicAllocation.diagnosis.interval.
El diagnóstico incluye un resumen del ejecutor con el recuento de ejecutores inactivos y los percentiles de tiempo de inactividad
, la distribución de tareas activas, el tamaño de los datos de ordenamiento aleatorio y el tamaño de RDD almacenado en caché.
Usa spark.dynamicAllocation.diagnosis.logLevel para controlar el nivel de registro de salida. |
false |
spark.dynamicAllocation.profile |
Establécelo en performance o cost para aplicar un conjunto predefinido de
configuraciones optimizadas para el rendimiento o la rentabilidad.
Las propiedades definidas por el usuario anulan los valores predeterminados del perfil. Consulta
Perfiles de asignación dinámica de Spark para obtener más detalles. |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
Cuando es true, habilita el cálculo dinámico del tiempo de espera para los ejecutores que contienen datos de ordenamiento aleatorio.
En lugar de usar el spark.dynamicAllocation.shuffleTracking.timeout estático,
el tiempo de espera se calcula en función de la cantidad de datos de ordenamiento aleatorio almacenados en el ejecutor.
Esto permite que los ejecutores con ordenamientos aleatorios pequeños se liberen más rápido, mientras que los ejecutores
con ordenamientos aleatorios grandes permanecen activos por más tiempo. |
false |
spark.reducer.fetchMigratedShuffle.enabled |
Cuando se establece en true, habilita la recuperación de la ubicación de salida de ordenamiento aleatorio desde el 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 Managed Service para Apache Spark
Spark runtime
versions
1.1.12 y posteriores, y 2.0.20 y posteriores. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Cuando es true, evita programar tareas en ejecutores con sesgo de ordenamiento aleatorio, que son ejecutores que tienen una gran cantidad de datos de ordenamiento aleatorio o una gran cantidad de tareas de mapa completadas. Esto puede mejorar el rendimiento mitigando el sesgo de ordenamiento aleatorio. |
false |
Perfiles de asignación dinámica de Spark
Puedes establecer la propiedad spark.dynamicAllocation.profile en performance o cost para aplicar un conjunto predefinido de configuraciones de Spark que están optimizadas para el rendimiento o la rentabilidad. Si estableces propiedades de Spark además de la propiedad spark.dynamicAllocation.profile, tu configuración anulará los valores predeterminados del perfil para esas propiedades.
performance: Este perfil se optimiza para el tiempo de ejecución mínimo aplicando la siguiente configuración predeterminada:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost: Este perfil se optimiza para reducir el consumo de recursos aplicando la siguiente configuración predeterminada:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
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 con 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 un ejecutor, el archivo de ordenamiento aleatorio se migra a los ejecutores activos. Sin embargo, como 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
ExecutorDeadExceptionyFetchFailedException.Solución: Habilita la recuperación de la ubicación de ordenamiento aleatorio estableciendo
spark.reducer.fetchMigratedShuffle.enabledentruecuando ejecutes tu carga de trabajo por lotes de Managed Service para Apache Spark (consulta Establece las propiedades de la carga 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.