El ajuste de escala automático de Managed Service para Apache Spark te permite escalar de forma dinámica los recursos de la carga de trabajo, como la cantidad de ejecutores, para ejecutar trabajos de Spark de manera eficiente. El ajuste de escala automático, que está habilitado de forma predeterminada, usa la asignación dinámica de recursos de Spark para determinar si se debe escalar tu carga de trabajo, cómo y cuándo.
Ajuste de escala automático de Managed Service para Apache Spark 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 de nodos asíncrona: El escalado automático V2 reemplaza la reducción de escala síncrona de V1 por la reducción de escala asíncrona. Con la reducción de escala asíncrona, Managed Service para Apache Spark reduce la escala de los recursos de la carga de trabajo sin esperar a que todos los nodos terminen la migración de redistribución. Esto significa que los nodos de cola larga que reducen la escala verticalmente de forma lenta no bloquearán el escalamiento vertical.
- Selección inteligente de nodos para reducir la escala verticalmente: El ajuste de escala automático V2 reemplaza la selección de nodos aleatoria de la V1 por un algoritmo inteligente que identifica los mejores nodos para reducir la escala verticalmente primero. Este algoritmo tiene en cuenta factores como el tamaño de los datos de shuffle del nodo y el tiempo de inactividad.
- Comportamiento configurable de retiro de servicio ordenado y migración de redistribución de Spark: 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 redistribución de Spark. Esta función puede ayudarte a mantener la compatibilidad de la migración con tus propiedades de Spark personalizadas.
Funciones de escalado automático de Managed Service para Apache Spark
| Función | Ajuste de escala automático de Managed Service para Apache Spark V1 | Ajuste de escala automático de Managed Service para Apache Spark V2 |
| Reducción de escala de nodos | Síncrona | Asíncrono |
| Selección de nodos para la reducción de escala | Aleatorio | Inteligente |
| Retiro de servicio ordenado de Spark y migración de shuffle | No configurable | Configurable |
Propiedades de asignación dinámica de Spark
En la siguiente tabla, se enumeran las propiedades de la 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 |
Es la versión de ajuste de escala automático de Managed Service para Apache Spark. Especifica
la versión 1 o 2. |
1 |
spark.dynamicAllocation.enabled |
Indica si se debe usar la asignación dinámica de recursos, que escala verticalmente 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 |
Es la cantidad inicial de ejecutores asignados a la carga de trabajo. Después de que
comienza 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 máximo es 2000. |
2 |
spark.dynamicAllocation.minExecutors |
Es la cantidad mínima de ejecutores a la que se puede reducir la carga de trabajo.
El valor mínimo es 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Es la cantidad máxima de ejecutores a los que se puede escalar la carga de trabajo.
El valor máximo es 2000. |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
Personaliza el escalamiento vertical de la carga de trabajo de Spark. Acepta un valor de 0 a 1. Un valor de 1.0
proporciona la máxima capacidad de escalamiento vertical y ayuda a lograr el máximo
paralelismo. Un valor de 0.5 establece la capacidad de escalamiento vertical y
el paralelismo en la mitad del valor máximo. |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
Cuando es true, se registra la información de diagnóstico si los ejecutores en ejecución superan la cantidad máxima de ejecutores 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 shuffle 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 |
Establece en performance o cost para aplicar un conjunto predefinido de
parámetros de configuración optimizados 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 shuffle.
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 shuffle almacenados en el ejecutor.
Esto permite que los ejecutores con reorganizaciones pequeñas se liberen más rápido, mientras que los ejecutores
con reorganizaciones grandes se mantienen 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 la redistribución 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
los errores ExecutorDeadException causados por la migración de bloques de shuffle
de ejecutores retirados a ejecutores activos y reduce los reintentos de etapa
causados por errores FetchFailedException (consulta
FetchFailedException causada por
ExecutorDeadException).
Esta propiedad está disponible en las versiones del entorno de ejecución de Spark de Managed Service para Apache Spark 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 shuffle, que son ejecutores que tienen una gran cantidad de datos de shuffle o una gran cantidad de tareas de asignación completadas. Esto puede mejorar el rendimiento, ya que mitiga el sesgo de redistribución. |
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 parámetros de configuración de Spark que estén optimizados para el rendimiento o la rentabilidad. Si configuras las 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 optimiza el tiempo de ejecución mínimo aplicando los siguientes parámetros de configuración predeterminados:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost: Este perfil optimiza la reducción del consumo de recursos aplicando los siguientes parámetros de configuración predeterminados:
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 e instrumentación).
| Métrica | Descripción |
|---|---|
maximum-needed |
Es la cantidad máxima de ejecutores necesarios con la carga actual para satisfacer todas las tareas en ejecución y pendientes. |
running |
Es la cantidad de ejecutores en ejecución que realizan tareas. |
Problemas y soluciones de la asignación dinámica de Spark
FetchFailedException causada por ExecutorDeadException
Causa: Cuando la asignación dinámica de Spark reduce la escala verticalmente de un ejecutor, el archivo de redistribución se migra a los ejecutores activos. Sin embargo, dado que la tarea del reductor de Spark en un ejecutor recupera el resultado de la redistribución de la ubicación establecida por el controlador de Spark cuando se inició la tarea del reductor, si se migra un archivo de redistribución, el reductor puede seguir intentando recuperar el resultado de la redistribución de un ejecutor retirado, lo que causa errores
ExecutorDeadExceptionyFetchFailedException.Solución: Habilita la recuperación de la ubicación de la redistribución configurando
spark.reducer.fetchMigratedShuffle.enabledcomotruecuando 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 del reductor vuelve a recuperar la ubicación de salida de la redistribución del controlador después de que falla una recuperación de un ejecutor retirado.