PySpark optimizado: particionamiento, caching y tuning para rendimiento
João Barros
27 de May de 2025
2 min de lectura
Apache Spark es potente pero exige atención a detalles de configuración y diseño para ejecutarse eficientemente a gran escala. Pequeños errores de particionamiento o joins mal planificados pueden multiplicar el tiempo de ejecución por 10x.
Particionamiento
El número de particiones define el paralelismo. Demasiado pocas particiones infrautilizan el clúster; demasiadas crean overhead de shuffle.
# Ver número de particiones actuales
print(df.rdd.getNumPartitions())
# Reparticionar (shuffle completo — caro)
df = df.repartition(200, "pais")
# Coalesce (sin shuffle — solo reduce)
df = df.coalesce(50)
Caching estratégico
# Cache en memoria (más rápido, puede ser evicted)
df_filtrado = df.filter(col("anio") == 2024).cache()
df_filtrado.count() # materializa el cache
# Persist con nivel explícito
from pyspark import StorageLevel
df_filtrado.persist(StorageLevel.MEMORY_AND_DISK_SER)
# Liberar cuando ya no es necesario
df_filtrado.unpersist()
Broadcast Join para tablas pequeñas
from pyspark.sql.functions import broadcast
# Fuerza el broadcast de la dimensión pequeña — evita shuffle en la tabla grande
df_result = df_hechos.join(broadcast(df_dim_producto), "id_producto")
Evitar shuffles innecesarios
# Malo: groupBy en columnas de alta cardinalidad sin necesidad
df.groupBy("id_cliente", "id_producto").agg(sum("importe"))
# Mejor: pre-agregar antes de los joins
df_agg = df.groupBy("id_producto").agg(sum("importe").alias("total"))
df_agg.join(df_dim_producto, "id_producto")
Configuraciones esenciales
spark.conf.set("spark.sql.shuffle.partitions", "200") # por defecto 200
spark.conf.set("spark.sql.adaptive.enabled", "true") # AQE — auto-tuning
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
Conclusión
El rendimiento en Spark es una combinación de buen diseño (particionamiento, evitar shuffles innecesarios, broadcast de dimensiones pequeñas) con una configuración adecuada (AQE, shuffle partitions). Use el Spark UI para identificar stages lentos y skew de datos antes de optimizar.