En este documento, se proporciona información sobre el ajuste de escala automático de Google Cloud Serverless para Apache Spark. Cuando envías tu carga de trabajo de Spark, Serverless para Apache Spark puede escalar de forma dinámica los recursos de la carga de trabajo, como la cantidad de ejecutores, para ejecutar tu carga de trabajo de manera eficiente. 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, cómo y cuándo escalar tu carga de trabajo.
Ajuste de escala automático de Serverless para Apache Spark, versión 2
La versión 2 (V2) del escalamiento 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: La versión 2 del ajuste de escala automático reemplaza la reducción de escala síncrona de la versión 1 por la reducción de escala asíncrona. Con el ajuste de escala asíncrono, Serverless for Apache Spark reduce los recursos de la carga de trabajo sin esperar a que todos los nodos finalicen la migración de la transferencia aleatoria. 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 reducir la escala: El ajuste de escala automático V2 reemplaza la selección aleatoria de nodos de la versión 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 aleatorios y el tiempo de inactividad del nodo.
- Comportamiento configurable de baja gradual y migración de shuffle de Spark: La versión 2 del ajuste de escala automático te permite usar propiedades estándar de Spark para configurar la baja gradual y la migración de shuffle 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 Serverless para Apache Spark
Función | Ajuste de escala automático de Serverless para Apache Spark, versión 1 | Ajuste de escala automático de Serverless para Apache Spark, versión 2 |
Reducción de la escala del nodo | 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 propiedades de Spark).
Propiedad | Descripción | Predeterminado |
---|---|---|
spark.dataproc.scaling.version |
Es la versión del ajuste de escala automático de Spark de Serverless para Apache Spark. Especifica la 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 o 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. Predeterminado: true . |
true |
spark.dynamicAllocation.initialExecutors |
Es 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 |
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 la que se puede escalar la carga de trabajo.
El valor máximo es 2000 . |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
Personaliza el aumento de la escala 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 aumento y ayuda a lograr el máximo paralelismo. Un valor de 0.5 establece la capacidad de ampliación y el paralelismo en la mitad del valor máximo. |
0.3 |
spark.reducer.fetchMigratedShuffle.enabled |
Cuando se configura como true , permite recuperar la ubicación de salida de la reorganización desde el controlador de Spark después de que falla una recuperación desde un ejecutor que se dio de baja debido a la asignación dinámica de Spark. Esto reduce los errores de ExecutorDeadException causados por la migración de bloques de aleatorización de ejecutores retirados a ejecutores activos, y reduce los reintentos de etapas causados por errores de FetchFailedException (consulta FetchFailedException causada por ExecutorDeadException).
Esta propiedad está disponible en las versiones de tiempo de ejecución de Spark
1.1.12 y posteriores, y 2.0.20 y posteriores de Serverless para Apache Spark. |
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 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 pendientes y en ejecución. |
running |
Es la cantidad de ejecutores en ejecución que ejecutan 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 cantidad de ejecutores, el archivo de intercambio se migra a los ejecutores activos. Sin embargo, dado que la tarea de reducción de Spark en un ejecutor recupera la salida de la reorganización de la ubicación establecida por el controlador de Spark cuando se inició la tarea de reducción, si se migra un archivo de reorganización, el reductor puede seguir intentando recuperar la salida de la reorganización de un ejecutor retirado, lo que provoca errores de
ExecutorDeadException
yFetchFailedException
.Solución: Habilita la recuperación de la ubicación de la reorganización estableciendo
spark.reducer.fetchMigratedShuffle.enabled
entrue
cuando ejecutes tu carga de trabajo por lotes de Serverless para Apache Spark (consulta Cómo establecer 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 reorganización del controlador después de que falla una recuperación de un ejecutor retirado.