Spark

Nivel medio

¿Por qué la ejecución adaptativa de consultas de Spark no está ayudando realmente a mi job?

AQE replanifica una consulta de Spark usando los números reales de un shuffle que ya corrió - no la suposición del planificador. Solo puede hacerlo si nada lo está desactivando en silencio.

Leer en:
Plan estático AQE: solo coalesce AQE: coalesce + skew
Aproximadamente cómo se reduce el tiempo de la etapa de shuffle al permitir ambos mecanismos de AQE - no un benchmark medido.

Dos configuraciones deciden si AQE hace algo en absoluto, y ambas pueden quedar puestas de forma que lo anulen sin un error, sin advertencia, ni ninguna señal en la Spark UI.

Qué cambia realmente AQE a mitad de la consulta

Después de que termina cada etapa de shuffle, AQE tiene tamaños de partición reales con los que trabajar - no la estimación inicial del planificador. Usa eso para fusionar muchas particiones de shuffle pequeñas en menos y más grandes, cambiar un sort-merge join a un broadcast join si un lado resulta ser lo bastante pequeño, y dividir una partición desproporcionadamente grande (skew) en varias tareas más pequeñas.

# ambas true por defecto en Spark 3.2+, pero verifique explícitamente spark.sql.adaptive.enabled=true spark.sql.adaptive.coalescePartitions.enabled=true

Por qué silenciosamente no hace nada

Los dos culpables habituales: spark.sql.adaptive.enabled puesto explícitamente en false en algún config compartido, o spark.sql.shuffle.partitions fijado junto con coalescePartitions.enabled=false - que deshabilita el único mecanismo que AQE aplica automáticamente en casi todo job. Ninguno de los dos aparece como error; el job simplemente corre exactamente como lo haría en Spark 2.x.

Dónde AQE no puede salvarlo

AQE solo se adapta después de un límite de shuffle - un job de una sola etapa sin shuffle no obtiene nada de él, y un job cuyo particionado inicial es malo mucho antes de cualquier shuffle igual paga ese costo por adelantado. AQE arregla lo que pasa después de un shuffle, no si la lectura en sí estaba particionada de forma sensata.

Vea cómo se ve esto en su propio pipeline.

Suba un event log real de Spark, un run_results.json de dbt o una exportación de métricas de Flink y obtenga recomendaciones concretas, que debe aprobar antes de aplicar - no otra regla general.