Big Data y Procesamiento Distribuido · Ingeniería de Datos

Spark: RDDs y DataFrames

Transformar datos distribuidos con Spark aprovechando la ejecución perezosa, distinguiendo el nivel bajo de RDD de la abstracción optimizada de DataFrame.

Spark: RDDs y DataFrames

No se calcula hasta que se pide La ejecución perezosa es el corazón de Spark: al encadenar transformaciones no se calcula nada, solo se dibuja un plano. Hasta que una acción no pide el resultado, el motor puede optimizar el todo antes de tocar los datos.

Resilient Distributed Dataset

Un RDD es una colección de partículas repartida entre nodos, tolerante a fallos por linaje. Se transforma con map, filter y reduce, y si un nodo cae, Spark reconstruye la partición perdida repitiendo los pasos del linaje.

Pereza y planificación

Las transformaciones son perezosas: construyen un grafo de instrucciones. Las acciones, como count o collect, disparan el cálculo. Esa separación deja al planificador fusionar y reordenar etapas.

Del RDD al DataFrame

El RDD obliga a pensar en partículas y escribir la lógica de datos a mano. DataFrame añade esquema y una capa que optimiza la consulta, como un motor SQL, quitando al programador el trabajo pesado.

Catalyst

Persistir en memoria

Cuando un resultado intermedio se reutiliza, conviene guardarlo en memoria o disco con persist. Es la herida que curaba Spark frente a MapReduce: evita recalcular y reescribir en cada etapa.

Cuatro cajas de contorno tenue enlazadas por flechas discontinuas forman un plano; una chispa brillante en el extremo dispara una flecha sólida hacia una tabla llena de datos, y un chip de memoria descansa debajo.
Nada se calcula hasta que una acción lo pide; entonces el plano optimizado aterriza sobre la memoria.

Shuffle aún pesa

Aunque sea rápido, el shuffle sigue siendo caro en Spark. Particionar bien y evitar reagrupaciones innecesarias marca la diferencia entre un job ágil y uno que se arrastra por mover datos entre nodos.

Cuándo cuál

DataFrame para casi todo: datos tabulares, optimización y claridad. RDD cuando hace falta control fino sobre partículas o estructuras no tabulares que el optimizador no entendería.

Errores frecuentes

Ejemplo resuelto: acelerar un job que repite el mismo volumen

Un entrenamiento lee cada vuelta los mismos cien gigabytes y tarda una hora por iteración. La corrección:

  1. Medir primero dónde se va el tiempo, mirando el plan y las etapas con shuffle.
  2. Persistir en memoria el conjunto base que todas las iteraciones reutilizan.
  3. Preferir DataFrame para que el optimizador pode columnas y empuje filtros al origen.
  4. Reparticionar solo por la clave con la que se agrega, evitando reagrupaciones extra.
  5. Comprobar con el historial de etapas que la segunda iteración ya no relee el disco.

¿Para qué sirve en la realidad?

Todo trabajo iterativo, del machine learning a los gráficos de recomendación, relee el mismo dato vuelta y vuelta. Entender la pereza y la persistencia decide si el experimento tarda minutos u horas.

Encadenas varias transformaciones en un DataFrame y no ves que se calcule nada hasta llamar a una acción. El comportamiento se debe a que Spark es:

Un DataFrame suele rendir mejor que un RDD equivalente porque Spark puede optimizar la consulta.

Spark

Colección distribuida tolerante a fallos de Spark
rdd
Reconstruir una partición perdida usando los pasos seguidos es...
linaje
Calcular solo al pedir el resultado es ejecución...
perezosa
Optimizador de consultas de Spark se llama...
catalyst
Guardar un intermedio para reusarlo es...
persistir

Ordena el ciclo de vida de un job Spark perezoso:

Transformar
Planificar
Optimizar
Acción

Guía de RDDs de Spark
Programación con RDDs, transformaciones perezosas y linaje.

Une cada pieza de Spark con su papel.

No se calcula hasta que se pide

# Spark
## RDD
### control fino
### linaje reconstruye
### optimización a mano
## DataFrame
### esquema visible
### Catalyst poda y empuja
## Pereza
### planos sin calcular
### la acción dispara
## Memoria
### persist evita recalcular
### shuffle sigue caro

Guía de DataFrames de Spark
Documentación oficial del API de DataFrame y del optimizador Catalyst.

Tu job iterativo reprocesa cada vuelta el mismo gran volumen. ¿Dónde aplicarías persist y por qué no basta con confiar en la pereza? Razona por reuso y memoria frente a recalculo.