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 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: true
  • spark.dynamicAllocation.executorIdleTimeout: 300s
  • spark.dynamicAllocation.initialExecutors: 10

cost: Este perfil se optimiza para reducir el consumo de recursos aplicando la siguiente configuración predeterminada:

  • 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 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 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 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.