lección 1
Cuando Pandas no puede más: el problema que resuelve Spark
Entiende con números reales por qué dividir el trabajo entre máquinas es la única salida cuando los datos crecen.
⏱ 50 min
### El día que tu script dejó de funcionar
Imagina que llevas seis meses en tu primer trabajo como ingeniero de datos. Tu pipeline funciona perfecto: cada mañana a las 6:00, un script en Python lee el CSV de ventas del día anterior, lo limpia con Pandas, calcula métricas y lo carga en la base de datos del warehouse. El CEO está contento, tu jefe te felicita. La vida es bella.
Hasta que llega el Black Friday. Y luego Cyber Monday. Y luego la campaña de Navidad. De repente, el CSV diario ya no pesa 200 MB — pesa 2 GB. Tu script, que tardaba 3 minutos, ahora tarda 45. Y un día, el fatídico lunes tras Black Friday, el archivo pesa 8 GB. Tu máquina tiene 16 GB de RAM. Pandas intenta cargar el archivo entero en memoria... y tu proceso muere con un MemoryError. El dashboard del CEO está vacío a las 9:00 AM. Tu teléfono no para de sonar.
Este escenario no es ficción. Es exactamente lo que le pasa a miles de equipos de datos cada año cuando su empresa crece. Y la pregunta que te haces es: ¿cómo proceso datos que literalmente no caben en la memoria de mi ordenador?
### El muro de la máquina individual
Pandas es una herramienta brillante. Es rápida, expresiva, con una API intuitiva. Pero tiene una limitación fundamental que no es un bug, sino una decisión de diseño: Pandas opera en una sola máquina y carga TODO en memoria RAM. Cuando tus datos superan la RAM disponible, Pandas simplemente no puede funcionar. No hay truco, no hay parámetro mágico, no hay optimización que te salve.
Hagamos números concretos. Una máquina típica de desarrollo tiene 16 GB de RAM. El sistema operativo y las aplicaciones consumen unos 4 GB. Python y sus librerías necesitan otro 1-2 GB. Te quedan unos 10 GB "libres". Pero Pandas, al cargar un CSV, necesita entre 2x y 5x el tamaño del archivo en memoria (por las conversiones de tipo, índices, copias internas). Así que un CSV de 5 GB puede necesitar 15-25 GB de RAM. Simplemente no cabe.
1import pandas as pd23# Supón que tu máquina tiene 32 GB de RAM (8 GB los usa el sistema)4ram_total_gb = 325ram_sistema_gb = 86ram_disponible_gb = ram_total_gb - ram_sistema_gb78print(f"RAM total: {ram_total_gb} GB")9print(f"RAM disponible: {ram_disponible_gb} GB")1011# ¿Puede Pandas con un archivo de 12 GB?12tamano_archivo_gb = 1213factor_pandas = 3 # Pandas necesita ~3x en RAM (índices, tipos, buffers)14ram_necesaria_gb = tamano_archivo_gb * factor_pandas1516print(f"Tamaño del archivo: {tamano_archivo_gb} GB")17print(f"RAM que necesitaría Pandas: {ram_necesaria_gb} GB")1819if ram_necesaria_gb > ram_disponible_gb:20 print("💥 MemoryError: no hay suficiente RAM para cargar este archivo")21 print(" Pandas necesita ~3x el tamaño del archivo en memoria")22else:23 print(f"✓ Cabe: {ram_disponible_gb} GB disponibles > {ram_necesaria_gb} GB necesarios")
El momento en que Pandas dice "hasta aquí llegué"
### La analogía del camión y la flota
Piensa en una mudanza. Tienes un apartamento pequeño: todo cabe en un solo viaje de camión. Pero un día te mudas a un almacén industrial con 500 toneladas de mercancía. ¿Qué haces? ¿Compras un camión del tamaño de un portaaviones? No — contratas una flota de 50 camiones que trabajan en paralelo. Cada camión lleva una parte de la carga, todos van al mismo destino, y entre todos terminan en una fracción del tiempo que tardaría uno solo.
Eso es exactamente lo que hace el procesamiento distribuido. En vez de intentar meter todos los datos en una sola máquina (el camión gigante imposible), los divides entre muchas máquinas que trabajan simultáneamente. Cada máquina procesa su porción, y al final los resultados se combinan. La suma de las memorias y CPUs de todas esas máquinas es tu capacidad real de procesamiento.
### Los números que debes tener en la cabeza
Para entender cuándo necesitas procesamiento distribuido, necesitas tener claro el orden de magnitud de los datos en el mundo real. Estos números no son teóricos — son lo que ves en empresas medianas y grandes:
- Startup con 10.000 usuarios: logs diarios de 500 MB - 2 GB. Pandas puede.
- E-commerce mediano (100.000 pedidos/día): datos diarios de 5-10 GB. Pandas empieza a sufrir.
- Fintech con millones de transacciones: datos diarios de 50-200 GB. Pandas no puede. Necesitas Spark.
- Red social o telco: datos diarios de 1-10 TB. Necesitas un cluster Spark potente.
- Netflix, Google, Meta: datos diarios de petabytes. Clusters de miles de nodos.
La regla empírica es simple: si tus datos caben cómodamente en la RAM de tu máquina (digamos, menos de 1/3 de tu RAM), Pandas es perfecto y más rápido para prototipar. Si tus datos superan la RAM disponible — o si el procesamiento tarda más de lo aceptable en una sola máquina — es hora de Spark.
Consejo de senior: no uses Spark cuando Pandas basta. He visto equipos usar un cluster de 20 nodos para procesar 500 MB. El overhead de distribución hace que sea MÁS LENTO que Pandas en datasets pequeños. La herramienta correcta para el tamaño correcto.
### ¿Por qué no simplemente comprar más RAM?
Es una pregunta legítima. Si mi máquina tiene 16 GB y necesito 64 GB, ¿por qué no alquilo una máquina con 256 GB de RAM en la nube? La respuesta es triple:
- 01.Coste: una máquina con 256 GB de RAM cuesta mucho más que 16 máquinas de 16 GB. El escalado vertical (más potencia en una máquina) es exponencialmente más caro que el horizontal (más máquinas baratas).
- 02.Límite físico: las máquinas más grandes del mercado tienen 12-24 TB de RAM. Suena como mucho, pero un dataset de 50 TB no cabe en ninguna máquina del planeta.
- 03.Tiempo: aunque la RAM sea suficiente, un solo procesador necesita mucho más tiempo que 100 procesadores trabajando en paralelo. 1 hora con 1 CPU vs 1 minuto con 60 CPUs.
El escalado vertical tiene un techo. El horizontal no. Esta es la razón fundamental por la que existe el procesamiento distribuido: no importa cuánto crezcan tus datos, siempre puedes añadir más máquinas al cluster.
### Qué es Apache Spark (en 30 segundos)
Apache Spark es un motor de procesamiento distribuido que divide tus datos entre múltiples máquinas, ejecuta operaciones en paralelo en cada una, y combina los resultados. Es el sucesor natural de Hadoop MapReduce (que veremos en la siguiente lección) y hoy es el estándar de facto para procesar grandes volúmenes de datos en la industria.
PySpark es la interfaz Python de Spark. Escribes código que parece Python (y de hecho ES Python), pero por debajo Spark lo distribuye entre todas las máquinas de tu cluster. La API es muy similar a Pandas: tienes DataFrames, columnas, filtros, agrupaciones, joins. Pero con la diferencia crucial de que funciona con datos de cualquier tamaño.
1# Pandas: todo en una máquina2import pandas as pd3df = pd.read_csv("ventas_50gb.csv") # 💥 MemoryError45# PySpark: distribuido entre máquinas6from pyspark.sql import SparkSession7spark = SparkSession.builder.appName("ventas").getOrCreate()8df = spark.read.csv("ventas_50gb.csv", header=True, inferSchema=True) # ✓ Funciona9# Spark NO carga todo en memoria de golpe.10# Divide el archivo en particiones y las reparte entre los nodos.
La misma intención, dos enfoques: Pandas (1 máquina) vs PySpark (cluster)
### El concepto clave: particionar los datos
La idea central del procesamiento distribuido es la partición. En vez de tener UN archivo gigante de 50 GB, lo divides en 500 particiones de 100 MB cada una. Cada nodo del cluster recibe unas cuantas particiones, las procesa en paralelo, y devuelve su resultado parcial. Es como repartir exámenes entre 50 profesores: cada uno corrige 6 exámenes en vez de que uno solo corrija 300.
Spark hace este particionamiento automáticamente. Cuando le dices "lee este archivo", Spark decide cuántas particiones crear (basándose en el tamaño del archivo y la configuración del cluster) y las reparte entre los nodos disponibles. Tú no tienes que pensar en esto al principio — pero entenderlo es crucial para optimizar más adelante.
Esto es lo que le diría a mi yo de hace 5 años: aprende Spark pensando en "datos que fluyen por tuberías entre máquinas". No pienses en tablas estáticas en memoria como con Pandas. Piensa en un río de datos que se divide en arroyos, cada arroyo pasa por una máquina diferente, y al final todos confluyen en el resultado.
### Cuándo usar Spark vs Pandas: la regla de oro
- Datos < 1-2 GB y procesamiento simple: Pandas. Más rápido, más fácil de debuggear, sin overhead de distribución.
- Datos de 2-10 GB: zona gris. Pandas puede funcionar en máquinas con mucha RAM, pero empieza a ser lento. Evalúa caso por caso.
- Datos > 10 GB: Spark. No hay alternativa práctica en una sola máquina.
- Datos de cualquier tamaño pero procesamiento muy complejo (muchos joins, muchas iteraciones): Spark, porque paraleliza el cómputo aunque los datos quepan en RAM.
- Prototipado rápido y exploración: siempre Pandas primero con una muestra pequeña. Luego escala a Spark.
En la siguiente lección vamos a entender cómo llegamos hasta aquí: la historia de Hadoop MapReduce, por qué era doloroso de usar, y cómo Spark lo reemplazó siendo 100 veces más rápido y mucho más sencillo de programar. Pero primero, vamos a practicar identificando cuándo Pandas no basta.
## ejercicios
Calcular si Pandas puede con tu dataset
Tu empresa tiene un archivo CSV de ventas de 12 GB. Tu máquina tiene 32 GB de RAM, de los cuales 8 GB están ocupados por el sistema. Escribe un script que calcule si Pandas puede cargar el archivo (recuerda: Pandas necesita ~3x el tamaño del archivo en RAM).
💡 Resultado esperado
RAM disponible: 24 GB RAM necesaria para Pandas: 36 GB ✗ Pandas NO puede. Necesitas procesamiento distribuido Te faltan 12 GB de RAM
Dimensionar un cluster Spark
El equipo de marketing te pide procesar 200 GB de logs de clickstream. Cada nodo de tu cluster tiene 32 GB de RAM (de los cuales 8 GB son para el sistema). ¿Cuántos nodos mínimo necesitas? Asume que Spark necesita 1.5x el tamaño de los datos en memoria total del cluster.
💡 Resultado esperado
RAM útil por nodo: 24 GB RAM total necesaria: 300.0 GB Nodos mínimos: 13 En la práctica, añade un 20-30% de margen: 17 nodos
Árbol de decisión: ¿Pandas o Spark?
Completa la función que recibe el tamaño del dataset en GB y la RAM disponible, y devuelve la herramienta recomendada con una explicación.
💡 Resultado esperado
pandas spark zona_gris
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...