Durante los últimos dos años, si querías trabajar con "Big Data", la respuesta por defecto era montar un clúster de Hadoop y escribir trabajos de MapReduce. Yo lo he intentado, y os aseguro que es una de las experiencias más frustrantes. Tienes que escribir 50 líneas de código verboso en Java (creando clases Mapper y Reducer) solo para contar las palabras de un fichero de log. Y lo peor: es desesperantemente lento porque escribe los resultados intermedios en el disco duro (HDFS) constantemente.

Pero el mes pasado, la Apache Software Foundation lanzó oficialmente la versión 1.0 de un proyecto que nació en la universidad de UC Berkeley: Apache Spark. Llevo el fin de semana probándolo en local y creo que acabo de ver la luz.

La revolución del procesamiento en memoria

El concepto clave de Spark son los RDD (Resilient Distributed Datasets). En lugar de escribir al disco en cada paso como hace Hadoop, Spark mantiene los datos en la memoria RAM distribuida del clúster a través de todo el flujo de operaciones, recurriendo al disco solo si no cabe.

Además, no tienes que aprender Java obligatoriamente ni compilar pesados .jar. Spark viene con APIs de primera clase para Scala y, gracias a Goku, para Python (PySpark). El código para procesar un log masivo y filtrar errores pasa de ser un mastodonte de Java a unas pocas líneas elegantes de programación funcional pura.

Mira qué maravilla en PySpark:

from pyspark import SparkContext

# Iniciamos el contexto de Spark usando todos los núcleos locales
sc = SparkContext("local[*]", "AnalisisDeLogs")

# Cargamos un log de servidor enorme
lineas_log = sc.textFile("/datos/servidor/access.log")

# Transformaciones (perezosas): filtramos las líneas con error 404
errores_404 = lineas_log.filter(lambda linea: " 404 " in linea)

# Mapeamos para quedarnos solo con la IP (asumiendo que es el primer elemento)
ips_error = errores_404.map(lambda linea: linea.split(" ")[0])

# Acción: recolectamos resultados o los guardamos
# (Aquí es cuando realmente Spark ejecuta todo el grafo de operaciones)
for ip in ips_error.take(10):
    print ip

Es intuitivo. Es rápido. Es conciso. Las operaciones como filter o map no se ejecutan inmediatamente; Spark construye un "grafo de ejecución" en segundo plano (DAG) y optimiza matemáticamente cómo procesar los datos de la forma más eficiente posible antes de lanzar la acción final.

Reflexión: El disco duro es la nueva cinta magnética

Hadoop popularizó la idea de distribuir los datos en hardware barato, pero su ejecución basada en disco ya no tiene sentido. Hoy en día, montar servidores con 256 GB de RAM es económicamente viable.

MapReduce es un dinosaurio pesado que pronto quedará relegado a tareas batch nocturnas de bajísima prioridad. Spark, con su velocidad (prometen ser hasta 100 veces más rápidos que Hadoop) y su capacidad para integrarse con librerías de Machine Learning (MLlib), va a ser el estándar absoluto. Me toca empezar a aprender Scala si quiero sacarle el máximo partido al motor nativo, porque esto no hay quien lo pare.