Saltar al contenido

lección 7

EMR: Spark gestionado en la nube

Cuándo usar EMR vs Glue, tipos de clúster, Spot instances para ahorrar hasta 90%, dimensionamiento y configuración de jobs Spark.

55 min

EMR no está en el plan gratuito de LocalStack (es del plan Ultimate, $89/mes). Los ejercicios de esta lección usan boto3 para crear y gestionar clústeres, que es API pura y funciona con moto (pip install "moto[server]" y python -m moto.server -p 4566). Lo que no podrás hacer en local es ejecutar un job Spark de verdad dentro del clúster — para eso necesitas AWS real, y un clúster EMR de 3 nodos m5.xlarge cuesta ~$0.77/hora. Apágalo cuando termines.

Ya conoces Spark de la Skill 13 (PySpark). Lo corriste en Docker en tu portátil. Pero cuando tus datos pasan de gigabytes a terabytes, necesitas un clúster REAL con decenas o cientos de nodos. EMR (Elastic MapReduce) es el servicio de AWS que te da clústeres Spark (y Hadoop, Hive, Presto) gestionados. Tú defines el tamaño, AWS lo levanta, lo ejecutas, lo apagas.

La gran pregunta es: ¿cuándo EMR vs Glue ETL? Ambos ejecutan Spark. La respuesta es control vs conveniencia. Glue es "dame tu script PySpark y yo me encargo de todo" — ideal para ETL estándar. EMR es "aquí tienes un clúster completo, configúralo como quieras" — necesario cuando quieres librerías custom, configuraciones específicas de Spark, o workloads muy grandes que necesitan tuning fino.

### EMR vs Glue: la decisión

  • Glue: sin gestión de infra, pago por DPU-hora, scripts simples, transformaciones estándar, datos < 10TB.
  • EMR: control total del clúster, puedes usar Spot instances (90% más barato), librerías custom, Spark UI completo, datos > 10TB.
  • Regla: si tu job se puede escribir en < 200 líneas de PySpark estándar, usa Glue. Si necesitas más, EMR.
  • Coste: Glue cobra premium por la conveniencia. EMR con Spot puede ser 5-10x más barato para workloads grandes.

### Anatomía de un clúster EMR

Un clúster EMR tiene tres tipos de nodos: Master (coordina el trabajo, ejecuta el driver Spark), Core (almacena datos HDFS y ejecuta tareas), y Task (solo ejecuta tareas, no almacena datos). Para data lakes en S3, los nodos Task son ideales porque no necesitas HDFS — tus datos ya están en S3.

1import boto3
2
3emr = boto3.client('emr', endpoint_url='http://localhost:4566',
4 aws_access_key_id='test', aws_secret_access_key='test',
5 region_name='eu-west-1')
6
7# Crear clúster EMR con Spot instances para Task nodes
8cluster = emr.run_job_flow(
9 Name='spark-etl-diario',
10 ReleaseLabel='emr-6.15.0',
11 Applications=[
12 {'Name': 'Spark'},
13 {'Name': 'Hive'}, # Para Glue Catalog compatibility
14 ],
15 Instances={
16 'MasterInstanceType': 'm5.xlarge',
17 'SlaveInstanceType': 'm5.2xlarge',
18 'InstanceCount': 3,
19 'KeepJobFlowAliveWhenNoSteps': False, # Apagar al terminar
20 'TerminationProtected': False,
21 },
22 Steps=[
23 {
24 'Name': 'ETL Ventas Diarias',
25 'ActionOnFailure': 'TERMINATE_CLUSTER',
26 'HadoopJarStep': {
27 'Jar': 'command-runner.jar',
28 'Args': [
29 'spark-submit',
30 '--deploy-mode', 'cluster',
31 's3://fashionstore-datalake/scripts/etl_ventas.py'
32 ]
33 }
34 }
35 ],
36 JobFlowRole='EMR_EC2_DefaultRole',
37 ServiceRole='EMR_DefaultRole',
38 LogUri='s3://fashionstore-datalake/emr-logs/',
39)
40print(f"Clúster creado: {cluster['JobFlowId']}")

Clúster EMR efímero: se levanta, ejecuta el job y se autodestruye

### Spot instances: la clave del ahorro

Las Spot instances son capacidad sobrante de AWS que puedes usar con descuentos de hasta 90%. El riesgo: AWS puede quitarte la instancia con 2 minutos de aviso si otro cliente la necesita a precio completo. Para nodos Task de EMR esto es perfecto: si pierdes un nodo Task, Spark reintenta las tareas en otros nodos. No pierdes datos (están en S3). Solo pierdes algo de tiempo.

La estrategia óptima: Master siempre On-Demand (si pierdes el master, pierdes el clúster). Core On-Demand o pocas Spot con tolerancia. Task: 100% Spot con diversificación de tipos de instancia (m5.xlarge, m5.2xlarge, m4.xlarge — así si un tipo se queda sin capacidad, usas otro).

Consejo de senior: para workloads batch nocturnos, usa clústeres EMR efímeros con Spot. El patrón es: Step Functions lanza el clúster → EMR ejecuta el job → el clúster se apaga solo. He visto reducciones de coste de $3000/mes a $300/mes solo con este cambio. El truco es que tu job sea idempotente (puede re-ejecutarse sin problemas si Spot interrumpe).

### Dimensionamiento: cuántos nodos necesitas

La regla de oro del dimensionamiento de EMR es: necesitas suficiente memoria total para que tus datos quepan en memoria + overhead de Spark (~30%). Si procesas 100GB de Parquet, necesitas ~130GB de memoria total en el clúster. Un m5.2xlarge tiene 32GB de RAM, así que necesitas ~4 nodos. Empieza pequeño y escala: es mejor lanzar un clúster chico, ver si funciona, y crecer desde ahí.

EMR cobra por las instancias EC2 subyacentes + un recargo EMR (~15-25%). Un clúster de 10 nodos m5.2xlarge corriendo 24/7 cuesta ~$4000/mes. SIEMPRE usa clústeres efímeros para batch y apágalos cuando no se usen. He visto clústeres EMR olvidados generando facturas de $10K+ al mes durante meses.

El patrón óptimo: Master estable, Tasks en Spot para máximo ahorro

## ejercicios

[01]

Calculadora de dimensionamiento EMR

El equipo necesita procesar 500GB de Parquet cada noche. Crea una función que calcule el número de nodos necesarios según el tipo de instancia y los datos.

Cargando editor...
[02]

Comparar costes EMR vs Glue

El equipo debate entre EMR y Glue para un job diario de 2 horas. Crea un comparador que muestre el coste mensual de cada opción.

Cargando editor...
[03]

Añadir Step a clúster EMR

Escribe una función que añada un step de Spark al clúster EMR para procesar datos de un día específico.

Cargando editor...
[04]

Monitor de estado del clúster

Crea una función que consulte el estado de un clúster EMR y sus steps, mostrando un resumen claro del progreso.

Cargando editor...

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...