Este post muestra primero un caso simple y reproducible de skew, y luego aplica la misma idea a un dataset más real. El objetivo es que la diferencia de performance sea evidente y fácil de medir. Ref: Spark SQL performance.
Descargas al final: ir a Descargas.
En pocas palabras
- El sesgo (skew) genera tasks lentas y stages largos.
- El salting reparte llaves “hot” entre particiones.
- Medirás antes/después con tiempos de stage y shuffle.
- Incluye repro sintética y ejemplo con dataset real.
Por qué el skew duele (y cómo ayuda el salting)
Cuando una llave domina, Spark envía casi todo el trabajo a pocas tasks. Esos “stragglers” controlan el tiempo total del stage. El salting agrega un bucket aleatorio a la llave hot para repartir las filas pesadas entre más particiones y balancear tiempos.
Repro rápida (sintética)
La versión mínima para ver el efecto con claridad.
Baseline (join con skew)
Primero ejecutamos el join sin mitigación para observar el cuello de botella.
| |
Salida esperada:
Un número grande (por ejemplo 10000000).
Después de salting (mismo join, tasks balanceadas)
Aplicamos salting para repartir la llave hot entre particiones.
| |
Salida esperada: El mismo conteo que el baseline.
Ejemplo real (NYC Taxi + zones)
Usa un dataset real para un caso práctico, manteniendo el mismo patrón de skew.
Cargar datos (Docker local primero)
Coloca los archivos de NYC Taxi en content/tools/apache-spark/docker/workspace/data/nyc_taxi/ para que se vean en el contenedor como /home/jovyan/work/data/nyc_taxi/.
| |
Cargar datos (Databricks sample data)
Si estás en Databricks, usa los datasets de ejemplo.
| |
Crear una llave con skew (simular un “hot” zone)
Forzamos skew para que el efecto sea visible.
| |
Salida esperada: Un conteo mayor a cero (depende del dataset).
Aplicar salting
Agregamos un salt para distribuir las filas calientes.
| |
Salida esperada: El mismo conteo que el baseline real.
Antes/después: qué capturar
Agrega tus métricas reales después de ejecutar el código.
Agrega estos números
- Tiempo total del job (baseline vs salted).
- Duración del stage del join.
- Shuffle read/write del stage.
- Max task time vs mediana.
Agrega estas capturas
- Spark UI: stage baseline con tasks desbalanceadas.
- Spark UI: stage con salting y tasks balanceadas.
- SQL tab: plan físico mostrando el join con salting.
Notas de práctica
- Empieza con
salt_bucketspequeño (8 o 16) y mide. - Aplica salting solo a llaves hot.
- Si el patrón cambia, revisa la lógica.
Ejecuta tú mismo
- Spark local (Docker): ruta principal del blog.
- Databricks Free Edition: alternativa rápida.
Docker quick start
| |
Links:
Descargas
Si no quieres copiar código, descarga el notebook o el .py.