(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Databricks

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.

Compartir: