Data Science
GCP Big Data Developer y Apache Hadoop
- apache
- GCP Google cloud
- Data Science
Temario del curso
- Fundamentos de Big Data y Hadoop
- Ecosistema Apache Hadoop
- Apache Spark y procesamiento distribuido
- Ingesta, almacenamiento y formatos de datos
- Desarrollo de aplicaciones Big Data
- Orquestación y flujos de trabajo
- Optimización, depuración y buenas prácticas
- Preparación para certificación Cloudera CCA
Examen de certificación
- Cloudera Certified Associate Spark and Hadoop Developer (CCA)
Referencias y notas relacionadas
- Apache Spark vs. Hadoop Diferencias Clave y Cuándo Usar Cada Uno
Objetivo General
Preparar al alumno para analizar y resolver problemas del mundo real utilizando Apache Hadoop y las herramientas asociadas al centro de datos empresariales.
El curso cubre todo el ciclo de diseño y construcción de soluciones Big Data:
- Ingesta de datos desde múltiples fuentes
- Selección del formato de archivo adecuado para almacenamiento
- Procesamiento eficiente de datos distribuidos
- Presentación de resultados al usuario final de forma clara y accionable
Se va más allá de MapReduce, incorporando componentes avanzados del ecosistema Hadoop para desarrollar aplicaciones de convergencia de datos, altamente relevantes para el negocio y orientadas a la toma de decisiones.
Competencias y conocimientos adquiridos
- Fundamentos del lenguaje Java aplicados al desarrollo Big Data
- Comprensión profunda de los componentes principales de Hadoop:
- HDFS
- MapReduce
- YARN
- Desarrollo de aplicaciones utilizando la API de Hadoop
- Depuración y optimización de programas MapReduce
- Introducción práctica a otros elementos clave del ecosistema Hadoop:
- Hive
- Pig
- HBase
- Flume
- Oozie
- Uso de Apache Spark como motor de procesamiento distribuido en memoria
- Diseño de arquitecturas Big Data escalables y tolerantes a fallos
Ecosistema Hadoop
HDFS (Hadoop Distributed File System)
- Sistema de archivos distribuido y tolerante a fallos
- Optimizado para grandes volúmenes de datos
- Replicación automática de bloques
- Acceso secuencial de alta eficiencia
MapReduce
- Modelo de programación distribuido
- Procesamiento por lotes
- Separación en fases Map y Reduce
- Escalable horizontalmente
YARN
- Gestor de recursos del clúster
- Permite ejecutar múltiples motores de procesamiento
- Base para la convivencia de MapReduce, Spark y otras herramientas
Herramientas del ecosistema
Apache Hive
- Lenguaje SQL-like (HiveQL)
- Ideal para análisis y consultas sobre HDFS
- Uso frecuente en entornos de data warehousing
Apache Pig
- Lenguaje de alto nivel (Pig Latin)
- Procesamiento de datos semiestructurados
- Enfoque procedural
Apache HBase
- Base de datos NoSQL orientada a columnas
- Acceso aleatorio en tiempo casi real
- Integración directa con HDFS
Apache Flume
- Ingesta de datos en tiempo real
- Recolección de logs y eventos
- Flujo de datos hacia HDFS o HBase
Apache Oozie
- Orquestador de flujos de trabajo
- Programación y coordinación de jobs Hadoop
- Integración con Hive, Pig y MapReduce
Apache Spark
- Motor de procesamiento distribuido en memoria
- Mucho más rápido que MapReduce para ciertos casos de uso
- Soporte para:
- Batch processing
- Streaming
- Machine Learning
- Graph processing
- APIs en Scala, Java y Python
Estructura modular
Módulo 1: Fundamentos de Desarrollo de Aplicaciones Python
- Sintaxis básica y avanzada de Python
- Estructuras de datos
- Programación orientada a objetos
- Preparación para el uso de Python en entornos Big Data
Módulo 2: Developer Training for Spark & Hadoop
- Arquitectura Hadoop
- Desarrollo con MapReduce
- Introducción y uso práctico de Apache Spark
- Integración Spark + HDFS
Módulo 3: Designing and Building Big Data Applications
- Diseño de arquitecturas Big Data
- Selección de herramientas adecuadas según el caso de uso
- Buenas prácticas de rendimiento y escalabilidad
- Casos reales de aplicación empresarial
modulos expandidos python y hadoop Big Data
Preparación para el uso de Python en entornos Big Data
Rol de Python en Big Data
- Lenguaje principal para análisis de datos, automatización y desarrollo rápido
- Amplio ecosistema de librerías orientadas a datos y procesamiento distribuido
- Integración directa con motores Big Data como Apache Spark y Hadoop
- Uso frecuente en pipelines de datos, prototipado y validación de modelos
Fundamentos de Python aplicados a datos
- Tipos de datos básicos y avanzados
- int, float, str, bool
- list, tuple, set, dict
- Control de flujo
- condicionales
- bucles
- comprensiones de listas y diccionarios
- Funciones
- definición y reutilización
- argumentos por defecto
- *args y **kwargs
- Manejo de errores
- try / except / finally
- creación de excepciones personalizadas
Programación orientada a objetos para Big Data
- Clases y objetos
- Encapsulación y modularidad
- Herencia y composición
- Diseño de código reutilizable para pipelines de datos
- Buenas prácticas de organización de proyectos Python
Manejo de archivos y formatos de datos
- Lectura y escritura de archivos
- CSV
- JSON
- Parquet
- Avro
- Serialización y deserialización de datos
- Procesamiento de grandes volúmenes sin cargar todo en memoria
- Uso de generadores e iteradores
Librerías clave de Python para Big Data
- NumPy
- Cálculo numérico
- Operaciones vectorizadas
- Pandas
- DataFrames
- Limpieza y transformación de datos
- Análisis exploratorio
- PyArrow
- Intercambio de datos columnar
- Integración con Parquet y sistemas distribuidos
- Dask
- Paralelismo y escalado en Python
- Procesamiento tipo Pandas distribuido
Introducción a PySpark
- Qué es PySpark y por qué se utiliza
- Diferencias entre Spark con Scala y Spark con Python
- Arquitectura básica de Spark
- Driver
- Executors
- Cluster Manager
- Creación de aplicaciones Spark con Python
RDDs y DataFrames en PySpark
- RDDs
- Transformations
- Actions
- DataFrames
- Esquemas
- Operaciones SQL-like
- Comparación RDD vs DataFrame
- Casos de uso recomendados para cada enfoque
Integración de Python con Hadoop
- Acceso a datos almacenados en HDFS
- Ejecución de jobs Spark sobre Hadoop
- Uso de Python para preprocesamiento y postprocesamiento
- Comunicación con Hive y HBase desde Python
Buenas prácticas de Python en entornos Big Data
- Escritura de código eficiente
- Minimizar operaciones costosas
- Uso adecuado de memoria
- Logging y monitorización
- Testing de pipelines de datos
- Versionado de código y entornos virtuales
Preparación para entornos productivos
- Estructuración de proyectos Big Data en Python
- Configuración de entornos virtuales
- Gestión de dependencias
- Ejecución en clúster frente a ejecución local
- Adaptación del código a entornos distribuidos
Preparación para el uso de Python en entornos Big Data — Ejemplos de código
Manejo eficiente de grandes volúmenes de datos en Python
Lectura de archivos grandes usando iteradores
def read_large_file(path):
with open(path, "r") as f:
for line in f:
yield line
for row in read_large_file("datos_grandes.csv"):
process(row)
`
Uso de generadores para optimizar memoria
Generadores aplicados a pipelines de datos
def clean_data(rows):
for r in rows:
yield r.strip().lower()
data = clean_data(read_large_file("input.txt"))
for row in data:
print(row)
Programación orientada a objetos aplicada a Big Data
Clase para un pipeline de procesamiento
class DataPipeline:
def __init__(self, source):
self.source = source
def extract(self):
for row in self.source:
yield row
def transform(self, rows):
for r in rows:
yield r.upper()
def load(self, rows):
for r in rows:
print(r)
pipeline = DataPipeline(read_large_file("data.txt"))
pipeline.load(pipeline.transform(pipeline.extract()))
Manejo de formatos comunes en Big Data
Lectura y escritura de CSV con Pandas
import pandas as pd
df = pd.read_csv("data.csv")
df["total"] = df["price"] * df["quantity"]
df.to_csv("output.csv", index=False)
Lectura y escritura de Parquet
df = pd.read_parquet("data.parquet")
df.to_parquet("output.parquet")
Uso de NumPy para cálculo eficiente
Operaciones vectorizadas
import numpy as np
data = np.array([10, 20, 30, 40])
result = data * 1.21
print(result)
Procesamiento distribuido con Dask
DataFrame distribuido tipo Pandas
import dask.dataframe as dd
df = dd.read_csv("large_*.csv")
df_filtered = df[df["sales"] > 1000]
df_filtered.compute()
Introducción a PySpark
Creación de una sesión Spark
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("BigDataApp") \
.getOrCreate()
RDDs en PySpark
Transformations y Actions
rdd = spark.sparkContext.parallelize([1, 2, 3, 4, 5])
rdd_squared = rdd.map(lambda x: x * x)
print(rdd_squared.collect())
DataFrames en PySpark
Creación y operaciones básicas
data = [("Ana", 34), ("Luis", 45), ("Eva", 29)]
df = spark.createDataFrame(data, ["name", "age"])
df.filter(df.age > 30).show()
Operaciones SQL-like en Spark
Uso de Spark SQL
df.createOrReplaceTempView("people")
spark.sql("SELECT name FROM people WHERE age > 30").show()
Lectura de datos desde HDFS con PySpark
Acceso a archivos distribuidos
df = spark.read.csv("hdfs:///data/input.csv", header=True)
df.show()
Integración de Python con Hive
Lectura de tablas Hive desde Spark
spark.sql("SELECT * FROM sales_db.transactions").show()
Buenas prácticas de logging
Logging en pipelines Big Data
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Inicio del procesamiento de datos")
Testing básico de funciones de datos
Prueba unitaria simple
def transform(x):
return x * 2
def test_transform():
assert transform(3) == 6
Estructuración de proyectos Big Data en Python
Estructura típica
project/
├── src/
│ ├── extract.py
│ ├── transform.py
│ └── load.py
├── tests/
│ └── test_transform.py
├── requirements.txt
└── main.py
Ejecución local vs clúster
Envío de una aplicación PySpark a clúster
spark-submit --master yarn app.py
Developer Training for Spark & Hadoop — Arquitectura Hadoop
Temario
- Visión general de Hadoop
- Principios de diseño
- Componentes principales
- Arquitectura HDFS
- Arquitectura YARN
- Arquitectura MapReduce
- Alta disponibilidad y tolerancia a fallos
- Escalabilidad y rendimiento
- Seguridad en Hadoop
- Despliegues y modos de operación
Visión general de Hadoop
- Framework de procesamiento distribuido orientado a Big Data
- Diseñado para:
- Grandes volúmenes de datos
- Hardware commodity
- Tolerancia a fallos
- Separación clara entre:
- Almacenamiento
- Gestión de recursos
- Procesamiento
Principios de diseño
- Escalabilidad horizontal
- Añadir nodos en lugar de aumentar potencia
- Tolerancia a fallos
- Replicación de datos
- Reintentos automáticos de tareas
- Procesamiento cerca de los datos
- Minimiza tráfico de red
- Modelo batch
- Optimizado para grandes volúmenes, no baja latencia
Componentes principales de Hadoop
- HDFS
- YARN
- MapReduce
- Hadoop Common
Hadoop Common
- Librerías y utilidades compartidas
- Configuración
- Gestión de E/S
- Base para el resto del ecosistema
Arquitectura HDFS
Componentes de HDFS
- NameNode
- Gestiona metadatos
- Mantiene el namespace del sistema de archivos
- Controla permisos y localización de bloques
- DataNode
- Almacena bloques de datos
- Ejecuta operaciones de lectura y escritura
- Secondary NameNode
- Checkpoints del estado del NameNode
- No es un backup activo
Bloques y replicación
- Tamaño de bloque grande (128 MB o superior)
- Replicación por defecto: 3
- Distribución automática entre DataNodes
- Re-replicación ante fallos
Flujo de lectura y escritura
- Cliente consulta al NameNode
- Acceso directo a DataNodes
- Escritura en pipeline
- Confirmaciones encadenadas
Arquitectura YARN
Rol de YARN
- Gestor de recursos del clúster
- Permite múltiples frameworks de procesamiento
- Base para Spark, MapReduce, Tez, Flink
Componentes de YARN
- ResourceManager
- Gestión global de recursos
- Planificación de aplicaciones
- NodeManager
- Gestión de recursos por nodo
- Monitorización de contenedores
- ApplicationMaster
- Gestión del ciclo de vida de cada aplicación
- Negociación de recursos con ResourceManager
Contenedores
- Unidad básica de asignación de recursos
- Define:
- Memoria
- CPU
- Aislados por aplicación
Arquitectura MapReduce
Modelo de ejecución
- Job
- Unidad completa de procesamiento
- Task
- Map Task
- Reduce Task
Fases de MapReduce
- Input Split
- Map
- Shuffle & Sort
- Reduce
- Output
Características clave
- Procesamiento batch
- Escritura intermedia a disco
- Alta fiabilidad
- Menor rendimiento frente a motores en memoria
Alta disponibilidad y tolerancia a fallos
HDFS HA
- NameNode activo y en standby
- JournalNodes para sincronización
- Failover automático
YARN HA
- ResourceManager activo/standby
- Recuperación de aplicaciones en ejecución
Manejo de fallos
- Reejecución automática de tareas
- Detección de nodos caídos
- Redistribución de bloques
Escalabilidad y rendimiento
- Escalado añadiendo nodos
- Balanceo automático de datos
- Optimización mediante:
- Tamaño de bloque
- Compresión
- Formatos columnar (Parquet, ORC)
- Ajuste de memoria y CPU en YARN
Seguridad en Hadoop
- Autenticación mediante Kerberos
- Autorización:
- Permisos HDFS
- ACLs
- Cifrado:
- Datos en reposo
- Datos en tránsito
- Auditoría y logs
Modos de despliegue
- Local Mode
- Desarrollo y pruebas
- Pseudo-distributed Mode
- Todos los servicios en una sola máquina
- Fully Distributed Mode
- Clúster real
- Producción
Developer Training for Spark & Hadoop — Desarrollo con MapReduce java
Temario
- Introducción a MapReduce
- Modelo de programación MapReduce
- Flujo de ejecución de un Job
- Componentes clave
- Desarrollo de MapReduce con Java
- Tipos de datos y formatos de entrada/salida
- Shuffle y Sort
- Partitioner y Combiner
- Optimización de Jobs MapReduce
- Casos de uso comunes
- Limitaciones de MapReduce
Introducción a MapReduce
- Modelo de programación distribuido incluido en Hadoop
- Orientado a procesamiento batch
- Diseñado para grandes volúmenes de datos
- Basado en dos fases principales:
- Map
- Reduce
- Alta tolerancia a fallos y escalabilidad
Modelo de programación MapReduce
Concepto clave
- Procesamiento de datos como pares clave–valor
- Cada fase transforma pares clave–valor en otros nuevos
Funciones principales
- Mapper
- Procesa datos de entrada
- Genera pares intermedios
- Reducer
- Agrega y procesa datos intermedios
- Produce el resultado final
Flujo de ejecución de un Job MapReduce
- Input Data
- InputFormat
- Input Split
- Mapper
- Shuffle & Sort
- Reducer
- OutputFormat
- Output Data
Componentes clave
Job
- Representa una ejecución completa de MapReduce
- Define:
- Clases Mapper y Reducer
- Tipos de clave y valor
- Formatos de entrada y salida
Task
- Unidad mínima de ejecución
- Tipos:
- Map Task
- Reduce Task
Desarrollo de MapReduce con Java
Estructura básica de un Job
- Driver
- Configuración y lanzamiento del Job
- Mapper
- Lógica de transformación
- Reducer
- Lógica de agregación
Mapper
public class WordCountMapper
extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String[] tokens = value.toString().split(" ");
for (String token : tokens) {
word.set(token);
context.write(word, one);
}
}
}
`
Reducer
public class WordCountReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
Driver
public class WordCountDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCountDriver.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Tipos de datos en MapReduce
- Writable
- IntWritable
- LongWritable
- Text
- DoubleWritable
- Serialización eficiente para entorno distribuido
Formatos de entrada y salida
InputFormat
- TextInputFormat
- KeyValueTextInputFormat
- SequenceFileInputFormat
OutputFormat
- TextOutputFormat
- SequenceFileOutputFormat
Shuffle y Sort
- Fase intermedia automática
- Redistribución de datos entre nodos
- Agrupación por clave
- Ordenación previa a Reduce
- Impacto crítico en el rendimiento
Partitioner
Función
- Determina a qué Reducer va cada clave
- Por defecto: HashPartitioner
Uso
- Controlar distribución de carga
- Evitar skew de datos
Combiner
Propósito
- Reducer local
- Reduce volumen de datos transferidos
- Optimización opcional
Requisitos
- Operación asociativa y conmutativa
Optimización de Jobs MapReduce
- Uso de Combiner
- Ajuste del número de Reducers
- Compresión de datos intermedios
- Uso de formatos eficientes (SequenceFile, Avro)
- Minimizar datos en Shuffle
- Evitar lógica pesada en Reducer
Casos de uso comunes
- Conteo y agregaciones masivas
- Procesamiento de logs
- ETL batch
- Análisis histórico de datos
- Procesos nocturnos de gran volumen
Limitaciones de MapReduce
- Alta latencia
- Escritura frecuente a disco
- Poco eficiente para:
- Procesos iterativos
- Análisis interactivo
- Streaming
- Motivo principal de la adopción de Apache Spark
Developer Training for Spark & Hadoop — Desarrollo de MapReduce con Python, PySpark
Temario
- MapReduce con Python en Hadoop
- Hadoop Streaming
- Arquitectura de Hadoop Streaming
- Desarrollo de Mapper en Python
- Desarrollo de Reducer en Python
- Tipos de entrada y salida
- Ejecución de Jobs MapReduce con Python
- Debugging y pruebas locales
- Buenas prácticas y limitaciones
MapReduce con Python en Hadoop
- Hadoop permite usar lenguajes distintos a Java mediante Hadoop Streaming
- Hadoop Streaming:
- Ejecuta programas externos como Mapper y Reducer
- Comunicación vía STDIN / STDOUT
- Python es ideal para:
- Prototipado rápido
- Procesamiento de texto
- ETL batch sencillo
Hadoop Streaming
Qué es
- Utilidad incluida en Hadoop
- Permite usar cualquier lenguaje que lea de entrada estándar y escriba a salida estándar
- Hadoop se encarga de:
- Distribución
- Shuffle & Sort
- Gestión de fallos
Flujo de ejecución
- Input desde HDFS
- Hadoop lanza el Mapper Python
- Salida del Mapper → Shuffle & Sort
- Entrada ordenada al Reducer Python
- Salida final a HDFS
Arquitectura de Hadoop Streaming
- Mapper
- Script Python
- Procesa línea a línea
- Reducer
- Script Python
- Recibe datos ordenados por clave
- Driver
- Comando
hadoop jar
- Comando
Desarrollo de Mapper en Python
Mapper básico (WordCount)
#!/usr/bin/env python3
import sys
for line in sys.stdin:
line = line.strip()
words = line.split()
for word in words:
print(f"{word}\t1")
`
Desarrollo de Reducer en Python
Reducer básico (WordCount)
#!/usr/bin/env python3
import sys
current_word = None
current_count = 0
for line in sys.stdin:
word, count = line.strip().split("\t")
count = int(count)
if current_word == word:
current_count += count
else:
if current_word:
print(f"{current_word}\t{current_count}")
current_word = word
current_count = count
if current_word:
print(f"{current_word}\t{current_count}")
Formato de entrada y salida
-
Entrada:
- Texto plano
- Una línea por registro
-
Salida:
- Formato clave–valor
- Separador por defecto: tabulación (
\t)
-
Hadoop se encarga de ordenar por clave antes del Reducer
Ejecución de un Job MapReduce con Python
Subida de datos a HDFS
hdfs dfs -put input.txt /user/hadoop/input
Ejecución del Job
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
-input /user/hadoop/input \
-output /user/hadoop/output \
-mapper mapper.py \
-reducer reducer.py \
-file mapper.py \
-file reducer.py
Visualización del resultado
Lectura de resultados desde HDFS
hdfs dfs -cat /user/hadoop/output/part-00000
Debugging y pruebas locales
Prueba local del Mapper
cat input.txt | python3 mapper.py
Prueba local del flujo completo
cat input.txt | python3 mapper.py | sort | python3 reducer.py
Casos de uso comunes
- Conteo de palabras
- Procesamiento de logs
- Agregaciones simples
- Limpieza y normalización de texto
- ETL batch sencillo
Buenas prácticas en MapReduce con Python
- Mantener lógica simple
- Evitar operaciones costosas en Reducer
- Usar Combiner cuando sea posible
- Validar entrada y salida
- Manejar errores de parsing
- Usar
#!/usr/bin/env python3y permisos de ejecución
Limitaciones de MapReduce con Python
- Menor rendimiento que Java
- Overhead de procesos externos
- Difícil manejo de tipos complejos
-
No recomendado para:
- Procesos iterativos
- Machine Learning
- Análisis interactivo
Comparación con alternativas
- MapReduce con Python:
- Simple
- Batch
- Bajo rendimiento
- PySpark:
- Procesamiento en memoria
- APIs de alto nivel
- Mejor opción para la mayoría de casos modernos
Developer Training for Spark & Hadoop — Introducción y uso práctico de Apache Spark
Temario
- Qué es Apache Spark
- Motivación y comparación con MapReduce
- Arquitectura de Spark
- Componentes principales
- Modos de despliegue
- APIs y lenguajes soportados
- Conceptos fundamentales
- Uso práctico con ejemplos
- Integración con Hadoop
- Casos de uso comunes
- Buenas prácticas
Qué es Apache Spark
- Motor de procesamiento distribuido
- Diseñado para:
- Alto rendimiento
- Procesamiento en memoria
- Baja latencia
- Parte del ecosistema Big Data moderno
- Compatible con Hadoop
Motivación y comparación con MapReduce
- Evita escritura frecuente a disco
- Procesamiento en memoria
- Ideal para:
- Procesos iterativos
- Análisis interactivo
- Machine Learning
- MapReduce:
- Batch
- Más lento
- Spark:
- Batch + Streaming + ML + Graph
Arquitectura de Spark
Componentes principales
- Driver
- Punto de entrada de la aplicación
- Coordina ejecución
- Cluster Manager
- YARN
- Standalone
- Mesos
- Kubernetes
- Executors
- Ejecutan tareas
- Mantienen datos en memoria
Flujo de ejecución
- Driver crea el DAG
- Planificación de tareas
- Ejecución distribuida
- Recolección de resultados
Componentes del ecosistema Spark
- Spark Core
- Spark SQL
- Spark Streaming
- MLlib
- GraphX
Modos de despliegue
- Local Mode
- Standalone Mode
- YARN Mode
- Kubernetes Mode
APIs y lenguajes soportados
- Scala
- Java
- Python (PySpark)
- R
Conceptos fundamentales
RDD
- Resilient Distributed Dataset
- Inmutable
- Distribuido
- Tolerante a fallos
DataFrame
- Estructura tabular distribuida
- Esquema definido
- Optimización automática (Catalyst)
Dataset
- Tipado fuerte (Scala/Java)
- Combina RDD y DataFrame
Transformations y Actions
- Transformations
- map
- filter
- flatMap
- Actions
- collect
- count
- save
Lazy Evaluation
- Las transformaciones no se ejecutan hasta una acción
Uso práctico de Apache Spark
Creación de una SparkSession
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("SparkIntro") \
.getOrCreate()
`
Lectura de datos desde HDFS
df = spark.read.csv("hdfs:///data/input.csv", header=True)
df.show()
Transformaciones básicas
df_filtered = df.filter(df["age"] > 30)
df_filtered.select("name", "age").show()
Agregaciones
df.groupBy("country").count().show()
Uso de Spark SQL
df.createOrReplaceTempView("people")
spark.sql("SELECT country, COUNT(*) FROM people GROUP BY country").show()
Escritura de resultados
df_filtered.write.parquet("hdfs:///data/output")
Integración con Hadoop
- Lectura y escritura directa sobre HDFS
- Ejecución sobre YARN
- Convivencia con MapReduce
- Uso de Hive Metastore
Casos de uso comunes
- ETL distribuido
- Procesamiento de logs
- Análisis interactivo
- Machine Learning
- Streaming de datos
Buenas prácticas
- Preferir DataFrames frente a RDDs
- Persistir solo cuando sea necesario
- Evitar collect() en grandes volúmenes
- Ajustar recursos de ejecución
- Usar formatos columnar
- Monitorear con Spark UI
Developer Training for Spark & Hadoop — Integración Spark + HDFS
Temario
- Relación entre Spark y HDFS
- Arquitectura de integración
- Acceso a datos en HDFS desde Spark
- Formatos de archivo soportados
- Lectura y escritura distribuida
- Persistencia y cacheo
- Ejecución de Spark sobre YARN
- Gestión de permisos y seguridad
- Rendimiento y optimización
- Casos de uso habituales
Relación entre Spark y HDFS
- HDFS actúa como:
- Sistema de almacenamiento distribuido
- Fuente y destino de datos
- Spark actúa como:
- Motor de procesamiento distribuido
- No sustituye a HDFS
- Separación clara:
- HDFS → almacenamiento
- Spark → cómputo
Arquitectura de integración
- Spark se ejecuta:
- Sobre YARN
- En modo Standalone
- En Kubernetes
- Acceso a HDFS mediante:
- Hadoop FileSystem API
- Configuración heredada de Hadoop
- Data locality:
- Spark intenta ejecutar tareas cerca de los bloques HDFS
Acceso a datos en HDFS desde Spark
Requisitos
- Hadoop configurado correctamente
- Variables de entorno:
- HADOOP_CONF_DIR
- YARN_CONF_DIR
- Permisos adecuados en HDFS
Lectura de datos desde HDFS
Lectura de CSV
df = spark.read \
.option("header", "true") \
.csv("hdfs:///data/input.csv")
df.show()
`
Lectura de Parquet
df = spark.read.parquet("hdfs:///data/input_parquet")
df.printSchema()
Lectura de JSON
df = spark.read.json("hdfs:///data/input.json")
df.show()
Escritura de datos en HDFS
Escritura en CSV
df.write \
.mode("overwrite") \
.option("header", "true") \
.csv("hdfs:///data/output_csv")
Escritura en Parquet
df.write \
.mode("overwrite") \
.parquet("hdfs:///data/output_parquet")
Formatos de archivo soportados
- Texto plano
- CSV
- JSON
- Parquet
- ORC
- Avro
- SequenceFile
Recomendaciones
- Usar formatos columnares:
- Parquet
- ORC
- Mejor compresión
- Mejor rendimiento en consultas
Persistencia y cacheo
Cacheo de DataFrames
df.cache()
df.count()
Persistencia con nivel de almacenamiento
from pyspark import StorageLevel
df.persist(StorageLevel.MEMORY_AND_DISK)
Ejecución de Spark sobre YARN
Envío de aplicación Spark
spark-submit \
--master yarn \
--deploy-mode cluster \
app.py
Beneficios
- Uso compartido de recursos
- Integración con ecosistema Hadoop
- Escalabilidad y alta disponibilidad
Gestión de permisos y seguridad
- Permisos HDFS:
- Lectura
- Escritura
- Ejecución
- Integración con Kerberos
- Spark hereda identidad del usuario
- Control de acceso a datos sensibles
Rendimiento y optimización
- Ajustar:
- Número de particiones
- Tamaño de bloques HDFS
- Evitar:
- Archivos pequeños
- collect() en grandes volúmenes
- Usar:
- Parquet con compresión
- Predicate pushdown
- Partition pruning
Casos de uso habituales
- ETL distribuido sobre HDFS
- Reemplazo de jobs MapReduce
- Análisis interactivo de datos históricos
- Preparación de datos para Machine Learning
- Procesamiento batch a gran escala
Designing and Building Big Data Applications — Diseño de arquitecturas Big Data
Temario
- Introducción al diseño de arquitecturas Big Data
- Principios de arquitectura Big Data
- Tipos de arquitecturas Big Data
- Capas de una arquitectura Big Data
- Arquitecturas batch
- Arquitecturas streaming
- Arquitecturas híbridas
- Selección de herramientas
- Escalabilidad y tolerancia a fallos
- Seguridad y gobierno del dato
- Buenas prácticas de diseño
Introducción al diseño de arquitecturas Big Data
- El diseño de arquitecturas Big Data busca:
- Procesar grandes volúmenes de datos
- Gestionar variedad y velocidad
- Garantizar fiabilidad y escalabilidad
- No existe una arquitectura única
- El diseño depende del:
- Caso de uso
- Tipo de datos
- Requisitos de negocio
Principios de arquitectura Big Data
- Escalabilidad horizontal
- Tolerancia a fallos
- Separación de responsabilidades
- Procesamiento distribuido
- Observabilidad y monitorización
- Automatización
Tipos de arquitecturas Big Data
Arquitectura Lambda
- Capa batch
- Capa speed (streaming)
- Capa serving
- Alta complejidad
- Consistencia eventual
Arquitectura Kappa
- Streaming como fuente principal
- Simplificación respecto a Lambda
- Reprocesamiento mediante replay
- Menor complejidad operativa
Arquitectura Batch tradicional
- Procesamiento periódico
- Orientada a históricos
- Alta latencia
Arquitectura Streaming
- Procesamiento en tiempo real
- Baja latencia
- Enfoque en eventos
Capas de una arquitectura Big Data
Capa de ingesta
- Captura de datos desde múltiples fuentes
- Batch o streaming
- Herramientas comunes:
- Kafka
- Flume
- Sqoop
- APIs
Capa de almacenamiento
- Almacenamiento distribuido
- Persistencia a largo plazo
- Herramientas comunes:
- HDFS
- Object Storage
- HBase
Capa de procesamiento
- Transformación y análisis de datos
- Batch y/o streaming
- Herramientas comunes:
- Spark
- MapReduce
- Flink
Capa de serving
- Exposición de datos procesados
- Consultas y consumo
- Herramientas comunes:
- Hive
- Presto
- Bases de datos analíticas
Capa de visualización
- Dashboards y reporting
- Herramientas BI
- Consumo por usuario final
Arquitecturas batch
- Procesamiento periódico
- Jobs programados
- Alta fiabilidad
- Ejemplos:
- ETL nocturno
- Análisis histórico
Arquitecturas streaming
- Procesamiento continuo
- Eventos en tiempo real
- Baja latencia
- Ejemplos:
- Monitorización
- Detección de fraude
- IoT
Arquitecturas híbridas
- Combinan batch y streaming
- Casos de uso complejos
- Balance entre latencia y consistencia
Selección de herramientas
- Volumen de datos
- Latencia requerida
- Complejidad operativa
- Coste
- Ecosistema existente
Escalabilidad y tolerancia a fallos
- Replicación de datos
- Reintentos automáticos
- Balanceo de carga
- Diseño sin single points of failure
Seguridad y gobierno del dato
- Autenticación
- Autorización
- Cifrado
- Auditoría
- Calidad del dato
- Catálogo de datos
Buenas prácticas de diseño
- Diseñar para el fallo
- Automatizar despliegues
- Usar formatos eficientes
- Documentar arquitectura
- Monitorizar desde el inicio
- Revisar periódicamente la arquitectura
Designing and Building Big Data Applications — Selección de herramientas adecuadas según el caso de uso
Temario
- Importancia de la selección de herramientas
- Factores clave de decisión
- Herramientas por capa de arquitectura
- Casos de uso batch
- Casos de uso streaming
- Casos de uso analíticos
- Casos de uso operacionales
- Comparativas habituales
- Anti-patrones comunes
- Buenas prácticas de selección
Importancia de la selección de herramientas
- Una mala elección impacta en:
- Rendimiento
- Coste
- Mantenibilidad
- No existe una herramienta universal
- La herramienta debe adaptarse al caso de uso
- Priorizar simplicidad y alineación con negocio
Factores clave de decisión
- Volumen de datos
- Velocidad de ingestión
- Latencia requerida
- Tipo de datos
- Estructurados
- Semiestructurados
- No estructurados
- Frecuencia de procesamiento
- Complejidad operativa
- Escalabilidad
- Ecosistema existente
- Coste
Herramientas por capa de arquitectura
Ingesta
- Batch
- Sqoop
- Scripts Python
- Streaming
- Kafka
- Flume
- APIs
Almacenamiento
- HDFS
- Object Storage
- HBase
- Data Lake
Procesamiento
- Batch
- Spark
- MapReduce
- Streaming
- Spark Structured Streaming
- Flink
Consulta y serving
- Hive
- Presto / Trino
- Impala
- Bases analíticas
Orquestación
- Oozie
- Airflow
Casos de uso batch
Características
- Alta latencia aceptable
- Grandes volúmenes
- Procesamiento periódico
Herramientas recomendadas
- HDFS
- Spark
- Hive
- Oozie
Ejemplos
- ETL nocturno
- Análisis histórico
- Reprocesamiento completo de datos
Casos de uso streaming
Características
- Baja latencia
- Eventos continuos
- Procesamiento en tiempo real
Herramientas recomendadas
- Kafka
- Spark Structured Streaming
- Flink
- HBase
Ejemplos
- Detección de fraude
- Monitorización en tiempo real
- IoT
Casos de uso analíticos
Características
- Consultas interactivas
- Grandes datasets
- Agregaciones complejas
Herramientas recomendadas
- Parquet / ORC
- Hive
- Presto / Trino
- Spark SQL
Ejemplos
- BI
- Reporting
- Data exploration
Casos de uso operacionales
Características
- Acceso casi en tiempo real
- Baja latencia de lectura
- Consultas por clave
Herramientas recomendadas
- HBase
- Cassandra
- Redis
Ejemplos
- Perfiles de usuario
- Recomendaciones
- Sistemas de scoring
Comparativas habituales
Spark vs MapReduce
- Spark
- Procesamiento en memoria
- Rápido
- MapReduce
- Batch
- Alta fiabilidad
Hive vs Presto
- Hive
- Batch
- Integración Hadoop
- Presto
- Interactivo
- Baja latencia
HDFS vs HBase
- HDFS
- Almacenamiento masivo
- HBase
- Acceso aleatorio
Anti-patrones comunes
- Usar streaming para procesos batch
- Usar HBase como data lake
- Procesar pequeños volúmenes con herramientas complejas
- Ignorar costes operativos
Buenas prácticas de selección
- Empezar simple
- Validar con pruebas de concepto
- Medir rendimiento
- Escalar progresivamente
- Documentar decisiones técnicas
Designing and Building Big Data Applications — Buenas prácticas de rendimiento y escalabilidad
Temario
- Principios generales de rendimiento
- Escalabilidad horizontal vs vertical
- Buenas prácticas en almacenamiento
- Buenas prácticas en procesamiento
- Gestión de particiones
- Uso eficiente de memoria
- Optimización de Spark
- Gestión de archivos pequeños
- Monitorización y tuning
- Anti-patrones comunes
Principios generales de rendimiento
- Diseñar pensando en el crecimiento
- Minimizar movimiento de datos
- Procesar cerca del almacenamiento
- Evitar cuellos de botella centralizados
- Medir antes de optimizar
Escalabilidad horizontal vs vertical
Escalabilidad horizontal
- Añadir nodos al clúster
- Modelo preferido en Big Data
- Mayor tolerancia a fallos
- Coste predecible
Escalabilidad vertical
- Aumentar recursos de un nodo
- Limitada físicamente
- Menor tolerancia a fallos
Buenas prácticas en almacenamiento
- Usar sistemas distribuidos
- HDFS
- Object Storage
- Elegir formatos eficientes
- Parquet
- ORC
- Activar compresión
- Evitar archivos muy pequeños
- Definir tamaños de bloque adecuados
Buenas prácticas en procesamiento
- Preferir motores en memoria
- Spark
- Evitar reprocesamientos innecesarios
- Reutilizar resultados intermedios
- Separar lógica batch y streaming
- Paralelizar tareas de forma equilibrada
Gestión de particiones
Importancia de las particiones
- Determinan paralelismo
- Impactan directamente en rendimiento
- Afectan uso de red y disco
Buenas prácticas
- Particionar por columnas de uso frecuente
- Evitar:
- Particiones demasiado grandes
- Particiones demasiado pequeñas
- Ajustar número de particiones según clúster
Uso eficiente de memoria
- No cargar datasets completos innecesariamente
- Liberar recursos tras su uso
- Persistir solo cuando aporta beneficio
- Elegir nivel de persistencia adecuado
Persistencia en Spark
from pyspark import StorageLevel
df.persist(StorageLevel.MEMORY_AND_DISK)
`
Optimización de Spark
Buenas prácticas generales
- Usar DataFrames en lugar de RDDs
- Evitar
collect()en grandes volúmenes - Usar
filteryselectlo antes posible - Aprovechar Catalyst Optimizer
Ajuste de recursos
- Memoria del driver
- Memoria de executors
- Número de cores por executor
Ejemplo de envío optimizado
spark-submit \
--executor-memory 4G \
--executor-cores 2 \
--num-executors 10 \
app.py
Gestión de archivos pequeños
Problema
- Sobrecargan NameNode
- Reducen eficiencia del procesamiento
Soluciones
- Compactar archivos
- Usar formatos columnar
- Reparticionar antes de escribir
Reparticionado en Spark
df.repartition(10).write.parquet("hdfs:///data/output")
Monitorización y tuning
- Usar Spark UI
- Analizar:
- DAG
- Stages
- Tasks
- Identificar skew de datos
- Ajustar configuración progresivamente
Anti-patrones comunes
- Sobreparticionar datos
- Usar un único reducer
- Ignorar el tamaño de los archivos
- Persistir todo indiscriminadamente
- Optimizar sin métricas
Buenas prácticas finales
- Diseñar para el fallo
- Escalar de forma incremental
- Automatizar despliegues
- Documentar configuraciones
- Revisar periódicamente el rendimiento
Designing and Building Big Data Applications — Casos reales de aplicación empresarial
Temario
- Introducción
- Casos en retail y e-commerce
- Casos en banca y finanzas
- Casos en telecomunicaciones
- Casos en salud
- Casos en IoT y Smart Cities
- Casos en medios y entretenimiento
- Beneficios obtenidos
- Lecciones aprendidas
- Buenas prácticas
Introducción
- Las aplicaciones Big Data buscan resolver problemas reales de negocio:
- Mejora de decisiones
- Optimización de procesos
- Personalización de servicios
- Integran ingesta, almacenamiento, procesamiento y visualización
- Casos variados muestran impacto en distintos sectores
Casos en retail y e-commerce
- Análisis de comportamiento de clientes
- Segmentación y recomendaciones personalizadas
- Herramientas: Spark, Hive, Kafka
- Optimización de inventario y logística
- Predicción de demanda
- Alertas de stock en tiempo real
- Ejemplo: Amazon utiliza Big Data para recomendaciones de productos y optimización logística
Casos en banca y finanzas
- Detección de fraude en transacciones
- Procesamiento en tiempo real
- Spark Streaming + Kafka + HBase
- Análisis de riesgos y scoring crediticio
- Modelos predictivos en batch
- Hadoop + Spark MLlib
- Regulación y cumplimiento normativo
- Auditoría y trazabilidad de transacciones
Casos en telecomunicaciones
- Monitorización de redes
- Detección de anomalías
- Streaming de logs y eventos
- Optimización de planes y ofertas
- Segmentación de clientes
- Personalización de servicios
- Ejemplo: análisis de tráfico móvil para mejorar cobertura y calidad de servicio
Casos en salud
- Análisis de historiales médicos
- Spark + HDFS para procesamiento masivo
- Identificación de patrones de enfermedad
- Investigación genética y bioinformática
- Procesamiento de secuencias genómicas
- Big Data para descubrimiento de fármacos
- Monitorización de pacientes en tiempo real
- IoT y streaming de dispositivos médicos
Casos en IoT y Smart Cities
- Monitorización de sensores urbanos
- Tráfico, calidad del aire, energía
- Procesamiento en tiempo real con Spark Streaming
- Mantenimiento predictivo de infraestructuras
- Análisis de datos de sensores industriales
- Ejemplo: Smart meters para consumo eléctrico eficiente
Casos en medios y entretenimiento
- Análisis de comportamiento de usuarios
- Recomendaciones de contenido
- Optimización de campañas publicitarias
- Procesamiento de logs y métricas
- Streaming y batch combinados
- Ejemplo: Netflix usa Spark y Hadoop para recomendaciones personalizadas y análisis de streaming
Beneficios obtenidos
- Reducción de costes operativos
- Mejora en la experiencia del cliente
- Aceleración en la toma de decisiones
- Predicción y prevención de problemas
- Mayor eficiencia en procesos internos
Lecciones aprendidas
- Elegir la herramienta adecuada según el caso de uso
- Combinar procesamiento batch y streaming según necesidad
- Diseñar arquitecturas escalables y tolerantes a fallos
- Importancia de la calidad y gobernanza de datos
- Monitorización y optimización continua
Buenas prácticas
- Empezar con pruebas de concepto
- Iterar y escalar progresivamente
- Integrar monitoreo desde el inicio
- Documentar arquitectura y decisiones
- Mantener seguridad y cumplimiento regulatorio
¿Te gusta este contenido? Suscríbete vía RSS