Apache Spark es un motor de computación distribuida diseñado para procesar grandes volúmenes de datos de forma eficiente y escalable. Proporciona una API fácil de usar para ejecutar tareas distribuidas en clústeres, aprovechando tanto la memoria como el almacenamiento en disco.
La computación distribuida en Apache Spark se basa en la división de grandes conjuntos de datos y tareas entre múltiples nodos de un clúster. Cada nodo realiza una parte del trabajo en paralelo, y los resultados se combinan al final. Esto permite procesar datos masivos (Big Data) rápidamente.
1. Driver: Coordina las tareas y distribuye el trabajo entre los ejecutores.
2. Ejecutores: Son los procesos que ejecutan tareas específicas en los nodos del clúster.
3. Cluster Manager: Administra los recursos del clúster (puede ser YARN, Mesos, o el administrador integrado de Spark).
4. RDDs (Resilient Distributed Datasets): Conjuntos de datos distribuidos e inmutables que representan el núcleo de la computación en Spark.
1. Velocidad: Procesa datos en memoria, reduciendo la latencia.
2. Escalabilidad: Escala horizontalmente al agregar más nodos al clúster.
3. Tolerancia a fallos: Recupera automáticamente datos y tareas fallidas.
4. Flexibilidad: Compatible con múltiples fuentes de datos (HDFS, S3, bases de datos, etc.) y lenguajes como Python, Scala, Java y R.
1. Input Data: Los datos se cargan desde fuentes como HDFS, S3 o bases de datos.
2. Transformations: Se aplican transformaciones (como map
, filter
, etc.) a los RDDs.
3. Actions: Se ejecutan acciones (reduce
, collect
, etc.) para generar los resultados.
4. Cluster Manager: Divide el trabajo entre nodos y asegura que las tareas se completen correctamente.
El SparkContext es la puerta de entrada para la computación distribuida en Spark.
from pyspark import SparkContext
# Inicializar SparkContext
sc = SparkContext("local", "Distributed Computing Example")
# Crear un RDD
data = [1, 2, 3, 4, 5]
rdd = sc.parallelize(data)
# Transformación: mapear los números al cuadrado
squared_rdd = rdd.map(lambda x: x ** 2)
# Acción: recolectar resultados
result = squared_rdd.collect()
print(result)
Spark puede cargar y procesar datos distribuidos almacenados en HDFS, S3 o en el sistema local.
# Leer un archivo de texto como RDD
text_rdd = sc.textFile("hdfs://namenode:8020/path/to/file.txt")
# Contar palabras
word_counts = text_rdd.flatMap(lambda line: line.split()) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
# Mostrar resultados
print(word_counts.collect())
Los DataFrames son estructuras de datos tabulares optimizadas para computación distribuida en Spark.
from pyspark.sql import SparkSession
# Crear SparkSession
spark = SparkSession.builder.appName("DataFrame Example").getOrCreate()
# Leer un archivo CSV como DataFrame
df = spark.read.csv("hdfs://namenode:8020/path/to/file.csv", header=True, inferSchema=True)
# Transformación: filtrar datos
filtered_df = df.filter(df["age"] > 30)
# Acción: mostrar resultados
filtered_df.show()
1. Particiones: Asegúrate de que los datos estén bien particionados para evitar cuellos de botella.
rdd = rdd.repartition(10) # Ajustar a 10 particiones
2. Persistencia: Usa la persistencia para evitar recomputaciones costosas.
rdd.persist()
3. Broadcast Variables: Envía datos pequeños a todos los nodos para evitar transferencias repetidas.
broadcast_var = sc.broadcast([1, 2, 3])
4. Acciones y Transformaciones: Aplica acciones solo cuando sea necesario. Las transformaciones son evaluadas de forma "perezosa" (lazy evaluation).
1. Análisis de grandes volúmenes de datos: Procesamiento de logs, datos financieros, o datos de sensores.
2. Aprendizaje automático: Entrenamiento de modelos distribuidos con MLlib, la biblioteca de machine learning de Spark.
3. Procesamiento en tiempo real: Uso de Spark Streaming para analizar datos en flujo desde Kafka, Flume, etc.
Característica | Apache Spark | Hadoop MapReduce |
---|---|---|
Velocidad | Más rápido (procesamiento en memoria). | Más lento (procesamiento en disco). |
Facilidad de uso | API simple para múltiples lenguajes. | Más complejo de implementar. |
Tolerancia a fallos | Soporte integrado. | Soporte integrado. |
Modelos soportados | Batch, Streaming, Machine Learning. | Solo Batch. |
Jorge García
Fullstack developer