lección 5
Glue: el pegamento que cataloga y transforma
Crawlers para descubrir esquemas, Data Catalog como metastore central, y ETL jobs serverless. Glue conecta tu data lake con todo el ecosistema AWS.
⏱ 55 min
Glue no está en el plan gratuito de LocalStack (su emulación es del plan Ultimate, $89/mes), pero no hace falta pagar para hacer estos ejercicios. Usa moto, un emulador de AWS en Python, gratuito y de código abierto: pip install "moto[server]" y python -m moto.server -p 4566. Es el mismo puerto y el mismo endpoint_url, así que el código de los ejercicios no cambia ni una línea. Emula el Data Catalog completo, que es todo lo que necesitas aquí. Lo que no emula es la ejecución real del crawler (se queda en RUNNING para siempre) ni los ETL jobs. La otra opción — una cuenta AWS real — para estos ejercicios cuesta $0, porque el primer millón de objetos catalogados y el primer millón de accesos son gratis.
AWS Glue es uno de esos servicios que suenan confusos al principio porque hace TRES cosas diferentes bajo el mismo nombre: 1) descubre esquemas automáticamente (crawlers), 2) mantiene un catálogo centralizado de todos tus datos (Data Catalog), y 3) ejecuta transformaciones ETL sin que gestiones servidores (ETL Jobs). Es como si un solo servicio fuera a la vez tu bibliotecario, tu índice de la biblioteca, y tu equipo de limpieza.
La metáfora del nombre es perfecta: Glue es el "pegamento" que une las piezas de tu data lake. Tienes archivos Parquet en S3 que Athena necesita consultar. ¿Cómo sabe Athena qué columnas tiene cada archivo? Gracias al Data Catalog de Glue. ¿Cómo llegó esa información al catálogo? Un crawler de Glue escaneó los archivos y descubrió el esquema. ¿Y quién transformó los CSV crudos en Parquet optimizado? Un ETL job de Glue.
### El Data Catalog: el índice de tu data lake
Imagina un data lake con 500 tablas repartidas en miles de archivos Parquet en S3. Sin un catálogo, es un pantano — nadie sabe qué datos hay, qué columnas tienen, qué formato usan. El Data Catalog es una base de datos de metadatos que registra: qué tablas existen, qué columnas tiene cada una, qué tipo de dato es cada columna, dónde están físicamente los archivos, y cómo están particionados.
El Catalog está organizado en: Databases (agrupaciones lógicas) → Tables (definiciones de esquema) → Partitions (subdivisiones de una tabla). Es conceptualmente idéntico al information_schema de PostgreSQL, pero para un data lake distribuido en S3.
1import boto323glue = boto3.client('glue', endpoint_url='http://localhost:4566',4 aws_access_key_id='test', aws_secret_access_key='test',5 region_name='eu-west-1')67# Crear una base de datos en el catálogo8glue.create_database(9 DatabaseInput={10 'Name': 'ecommerce_datalake',11 'Description': 'Data lake de FashionStore: ventas, clientes, productos'12 }13)1415# Registrar una tabla manualmente (normalmente lo hace el crawler)16glue.create_table(17 DatabaseName='ecommerce_datalake',18 TableInput={19 'Name': 'ventas_raw',20 'Description': 'Ventas diarias en formato CSV crudo',21 'StorageDescriptor': {22 'Columns': [23 {'Name': 'order_id', 'Type': 'string'},24 {'Name': 'customer_id', 'Type': 'string'},25 {'Name': 'product_id', 'Type': 'string'},26 {'Name': 'quantity', 'Type': 'int'},27 {'Name': 'price', 'Type': 'double'},28 {'Name': 'order_date', 'Type': 'string'},29 ],30 'Location': 's3://datalake-empresa/raw/ventas/',31 'InputFormat': 'org.apache.hadoop.mapred.TextInputFormat',32 'OutputFormat': 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat',33 'SerdeInfo': {34 'SerializationLibrary': 'org.apache.hadoop.hive.serde2.OpenCSVSerde'35 }36 },37 'PartitionKeys': [38 {'Name': 'year', 'Type': 'string'},39 {'Name': 'month', 'Type': 'string'},40 ]41 }42)43print("✅ Database y tabla creadas en el catálogo")
El Data Catalog registra la estructura de tus datos — es el "information_schema" del data lake
### Crawlers: descubrimiento automático de esquemas
Un crawler es un proceso que escanea una ubicación de S3, analiza los archivos que encuentra, infiere el esquema (columnas y tipos), y registra la información en el Data Catalog. Es como un robot que entra en tu almacén, abre cada caja, apunta qué contiene y actualiza el inventario automáticamente.
1# Crear un crawler que escanee la zona raw de ventas2glue.create_crawler(3 Name='ventas-raw-crawler',4 Role='arn:aws:iam::000000000000:role/GlueETLRole',5 DatabaseName='ecommerce_datalake',6 Targets={7 'S3Targets': [8 {'Path': 's3://datalake-empresa/raw/ventas/'}9 ]10 },11 Description='Descubre esquema de archivos de ventas en raw/',12 SchemaChangePolicy={13 'UpdateBehavior': 'UPDATE_IN_DATABASE',14 'DeleteBehavior': 'LOG'15 }16)1718# Ejecutar el crawler19glue.start_crawler(Name='ventas-raw-crawler')20print("🕷️ Crawler ejecutándose...")
El crawler escanea S3, descubre columnas y tipos, y actualiza el catálogo
Consejo de senior: programa los crawlers para que se ejecuten DESPUÉS de que lleguen datos nuevos, no en un schedule fijo. Si tu pipeline ETL termina a las 3AM, el crawler debe correr a las 3:15AM. Así el catálogo siempre refleja el estado real de los datos. Un catálogo desactualizado es peor que no tener catálogo.
### ETL Jobs: transformaciones serverless
Los Glue ETL Jobs son scripts de PySpark que AWS ejecuta sin que tú gestiones ningún clúster. Escribes el código de transformación, especificas cuántos DPUs (Data Processing Units) quieres, y Glue se encarga de levantar el clúster, ejecutar tu código y apagarlo. Pagas solo por el tiempo de ejecución.
Glue ETL es ideal cuando: tus transformaciones son de complejidad media, no necesitas control fino del clúster Spark, y prefieres no gestionar infraestructura. Si necesitas más control (tuning fino de Spark, librerías personalizadas pesadas), entonces EMR es mejor opción.
1# Ejemplo conceptual de un Glue ETL Job script2# (Este script correría dentro del entorno Glue, no en local)3"""4import sys5from awsglue.transforms import *6from awsglue.utils import getResolvedOptions7from pyspark.context import SparkContext8from awsglue.context import GlueContext910# Inicializar contexto11sc = SparkContext()12glueContext = GlueContext(sc)13spark = glueContext.spark_session1415# Leer datos del catálogo (no necesitas especificar esquema ni ruta)16ventas_raw = glueContext.create_dynamic_frame.from_catalog(17 database="ecommerce_datalake",18 table_name="ventas_raw"19)2021# Transformar: limpiar, filtrar, convertir tipos22ventas_limpio = ventas_raw.resolveChoice(specs=[23 ('price', 'cast:double'),24 ('quantity', 'cast:int')25])2627# Escribir en formato Parquet en zona processed28glueContext.write_dynamic_frame.from_options(29 frame=ventas_limpio,30 connection_type="s3",31 connection_options={"path": "s3://datalake-empresa/processed/ventas/"},32 format="parquet"33)34"""35print("👆 Este script correría dentro de un Glue ETL Job")
Un Glue Job es PySpark con helpers de Glue — lee del catálogo y escribe en S3
### Cuándo usar Glue vs otras opciones
- Glue ETL: transformaciones PySpark sin gestionar infraestructura. Ideal para ETL estándar.
- Glue Crawler: descubrir esquemas automáticamente. Siempre útil.
- EMR: cuando necesitas control total del clúster Spark, librerías custom, o workloads muy grandes.
- Lambda: para transformaciones simples de archivos individuales (< 15 min, < 10GB RAM).
- Athena CTAS: para transformaciones SQL puras (crear tabla como resultado de un SELECT).
Los Glue ETL Jobs tienen un mínimo de facturación de 1 minuto y cobran por DPU-hora (cada DPU cuesta ~$0.44/hora). Un job que tarda 10 segundos te cobra como si tardara 1 minuto. Para transformaciones muy pequeñas y frecuentes, Lambda puede ser más económico. Haz las cuentas antes de elegir.
Consejo de senior: el Data Catalog de Glue es COMPARTIDO con Athena, EMR y Lake Formation. Cuando registras una tabla en el catálogo, automáticamente es consultable desde Athena sin configuración adicional. Este es el verdadero poder de Glue: es el metastore central de todo tu ecosistema.
## ejercicios
Crear catálogo de un e-commerce
FashionStore necesita registrar sus tablas en el Data Catalog. Crea una database y 3 tablas: ventas, clientes y productos, cada una con sus columnas y la ubicación en S3.
Explorar el catálogo programáticamente
Escribe funciones para explorar el catálogo: listar databases, listar tablas de una database, y mostrar el esquema de una tabla específica.
Configurar crawler para zona raw
Crea un crawler que escanee la zona raw/ventas/ de S3 y registre automáticamente las tablas que encuentre en el catálogo.
Detectar cambios de esquema
Escribe una función que compare el esquema actual de una tabla en el catálogo con un esquema nuevo (simulando que llegaron datos con columnas diferentes) y reporte las diferencias.
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...