Spark

Nivel medio

¿Por qué la utilización de mi clúster de Spark es baja aunque el job termine bien?

«Terminó sin errores» y «usamos el clúster que estamos pagando» son dos afirmaciones distintas - y el estado verde del job solo confirma una de ellas.

Leer en:
Particiones < núcleos Cuello de botella (stage) Retraso de allocation
El orden habitual de causas de baja utilización en un job por lo demás exitoso - ilustrativo, no medido.

Que un job termine con éxito solo significa que todas las tareas completaron sin fallar. No dice nada sobre si la mitad de tus executors estuvo inactiva mientras tanto.

La causa más común: menos particiones que núcleos

Si un stage tiene 200 particiones y tu clúster tiene 400 núcleos disponibles, la mitad del clúster no recibe ninguna tarea durante toda la duración de ese stage - precio completo, cero trabajo. Esto aparece constantemente en jobs que heredaron un número de particiones de shuffle de un clúster mucho más pequeño y nunca se revisó después de escalar.

# estimación aproximada de slots activos para un stage dado active_task_slots = min(stage_partition_count, total_executor_cores)

La segunda causa más común: un stage domina el tiempo total

Una transformación pesada en UDFs, o un filtro mal empujado hacia abajo (poor pushdown), puede hacer que un solo stage ocupe el 80% del tiempo total del job mientras solo toca una fracción de las particiones de los datos - el resto del clúster queda inactivo esperando que ese stage termine. El dynamic allocation ayuda a recortar el costo aquí (libera executors inactivos), pero no corrige la forma subyacente del problema; el job sigue estando limitado por ese único stage sin importar cuántos executors estén técnicamente disponibles.

La métrica que realmente distingue ambos casos

En la pestaña Executors de la Spark UI, compara el task time de cada executor contra el elapsed time total del job. Un ratio muy por debajo de 1 en la mayoría de los executors, durante casi todo el job, apunta al desajuste entre particiones y núcleos. Un ratio cercano a 1 durante la mayor parte del job pero con una caída visible en un stage específico apunta al cuello de botella de un solo stage - causas distintas para lo que en un dashboard de costos parece el mismo síntoma.

Mira cómo se ve esto en tu propio pipeline.

Sube un event log real de Spark, un run_results.json de dbt, o una exportación de métricas de Flink, y recibe recomendaciones concretas que requieren tu aprobación - no otra regla general.