Ajusta automáticamente la escala de workload resource_allocation_properties

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 escalar 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, cómo y cuándo escalar tu carga de trabajo.

Escalamiento automático de Managed Service para Apache Spark, versión 2

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 escalado automático V2 reemplaza la reducción de escala síncrona de la versión 1 por la reducción de escala asíncrona. Con Managed Service para Apache Spark, se reduce la escala verticalmente de los recursos de la carga de trabajo sin esperar a que todos los nodos finalicen la migración de la reorganización. Esto significa que los nodos de cola larga que se reducen lentamente no bloquearán el aumento de escala.
  • Selección inteligente de reducción de nodos: El ajuste de escala automático V2 reemplaza la selección aleatoria de nodos de la versión 1 por un algoritmo inteligente que identifica los mejores nodos para reducir primero. Este algoritmo considera factores como el tamaño de los datos de reorganización y el tiempo de inactividad del nodo.
  • Comportamiento configurable de migración de datos aleatorios y de baja gradual 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 datos aleatorios de Spark. Esta función puede ayudarte a mantener la compatibilidad de la migración con tus propiedades personalizadas de Spark.

Funciones de ajuste de escala automático de Managed Service para Apache Spark

Función Autoscaling V1 de Managed Service para Apache Spark Managed Service para Apache Spark Autoscaling V2
Reducción de la escala de nodos Síncrona Asíncrono
Selección de nodos para la reducción Aleatorio Inteligente
Retiro de servicio ordenado de Spark y migración de la reorganización 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 Versión del 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 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 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 ampliación 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.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 Shuffle y el tamaño del RDD almacenado en caché. Usa spark.dynamicAllocation.diagnosis.logLevel para controlar el nivel de registro de salida. false
spark.dynamicAllocation.profile Se establece 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 los 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 mezcla. 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 mezcla almacenados en el ejecutor. Esto permite que los ejecutores con pequeñas reorganizaciones se liberen más rápido y que los ejecutores con grandes reorganizaciones sigan activos por más tiempo. false
spark.reducer.fetchMigratedShuffle.enabled Cuando se establece en 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 ExecutorDeadException (consulta FetchFailedException causada por ExecutorDeadException).FetchFailedException Esta propiedad está disponible en las versiones del entorno de ejecución de Spark 1.1.12 y posteriores, y 2.0.20 y posteriores de Managed Service para Apache Spark. false
spark.scheduler.excludeShuffleSkewExecutors Cuando es true, evita programar tareas en ejecutores con sesgo de aleatorización, que son ejecutores que tienen una gran cantidad de datos de aleatorización o una gran cantidad de tareas de mapa completadas. Esto puede mejorar el rendimiento, ya que mitiga la asimetría del orden 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 se optimizan para el rendimiento o la rentabilidad. Si configuras 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 reducir al mínimo el tiempo de ejecución aplicando los siguientes parámetros de configuración predeterminados:

  • spark.scheduler.excludeShuffleSkewExecutors: true
  • spark.dynamicAllocation.executorIdleTimeout: 300s
  • spark.dynamicAllocation.initialExecutors: 10

cost: Este perfil se optimiza para reducir el consumo de recursos aplicando los siguientes parámetros de configuración predeterminados:

  • spark.dynamicAllocation.executorIdleTimeout: 120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout: 120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled: true
  • spark.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 registro).

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 reorganización 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 ExecutorDeadException y FetchFailedException.

    Solución: Habilita la recuperación de la ubicación de la reorganización estableciendo spark.reducer.fetchMigratedShuffle.enabled en true cuando ejecutes tu carga de trabajo por lotes de Managed Service 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.