lección 8
Catálogos y gobernanza: saber qué datos tienes y quién puede verlos
Data catalogs, descubrimiento, linaje, permisos, data contracts y el arte de gobernar un data lake sin convertirlo en pantano.
⏱ 50 min
Has construido un data lake con zonas claras, Parquet optimizado, Iceberg para ACID y time travel. Técnicamente es sólido. Pero falta una pieza crítica que separa un lake funcional de un lake que realmente FUNCIONA para toda la organización: ¿cómo sabe alguien qué datos existen? ¿Dónde están? ¿Qué significan? ¿Quién los creó? ¿Puedo confiar en ellos? ¿Tengo permiso para verlos?
Estas preguntas son el dominio de la gobernanza de datos — y su herramienta principal es el catálogo. Un data catalog es como el catálogo de una biblioteca: te dice qué libros hay, dónde están, de qué tratan, quién los escribió, y si puedes sacarlos. Sin catálogo, tu lake de 500 tablas es tan útil como una biblioteca sin índice.
Cerramos la skill en modo panorama: aquí entiendes QUÉ es un catálogo, qué problema resuelve la gobernanza y cómo encajan las piezas (linaje, permisos, contratos). Configurar un AWS Glue Catalog real requiere un entorno cloud (LocalStack Pro o una cuenta AWS). Hoy sales sabiendo reconocer y razonar sobre gobernanza, que es exactamente lo que se espera a este nivel.
### Qué es un data catalog y por qué lo necesitas
Un data catalog es un registro centralizado de todos los datasets de tu organización. Para cada dataset almacena: ubicación física (s3://bucket/path), esquema (columnas y tipos), descripción en lenguaje humano, propietario (equipo responsable), linaje (de dónde vienen los datos y a dónde van), estadísticas (filas, tamaño, frescura), etiquetas y clasificaciones (PII, financiero, público), y permisos de acceso.
- AWS Glue Data Catalog: el catálogo nativo de AWS. Integrado con Athena, Redshift, EMR. Almacena esquemas de tablas como "databases" y "tables". Es lo que usarás en la Skill de Cloud.
- Apache Hive Metastore: el estándar open-source histórico. Spark, Trino y Presto lo usan como catálogo por defecto.
- DataHub (LinkedIn): catálogo moderno open-source con búsqueda, linaje automático y gobernanza. Ideal para empresas medianas-grandes.
- OpenMetadata: alternativa open-source más reciente con UI moderna y soporte de data quality.
- Unity Catalog (Databricks): catálogo propietario con permisos granulares. Solo para ecosistema Databricks.
### Linaje de datos: de dónde vienen y a dónde van
El linaje (data lineage) responde a la pregunta: "este número en el dashboard del CEO, ¿de dónde sale?". Es la trazabilidad completa del dato desde su origen hasta su destino final. Si el dashboard muestra revenue = $1.2M pero el CEO dice que debería ser $1.5M, el linaje te permite recorrer: dashboard ← gold.metricas ← silver.ventas ← raw/api_stripe/2024-01-15.json. Y encontrar dónde se perdió la discrepancia.
El linaje puede ser manual (documentado por humanos) o automático (inferido por herramientas que analizan tu código SQL/Python). Las herramientas modernas como DataHub y OpenMetadata extraen linaje automáticamente de queries SQL, DAGs de Airflow, y jobs de Spark.
El linaje automático es el que funciona en la práctica. El manual se desactualiza el primer día. Invierte en herramientas que lo extraigan de tu código. Y si no puedes, al menos documenta el linaje de las 10 tablas gold más importantes — son las que el CEO preguntará.
### Permisos y acceso: quién puede ver qué
En un lake maduro, no todos pueden ver todos los datos. El equipo de RRHH no debería ver datos financieros. Marketing no debería ver datos de salarios. Y nadie debería poder acceder a PII (información personal identificable) sin justificación. Los permisos se implementan en varias capas:
- 01.Nivel storage (S3 IAM): políticas que controlan quién puede leer/escribir en qué prefijos de S3. Es el nivel más bajo y más seguro.
- 02.Nivel catálogo: el catálogo puede definir quién puede ver qué tablas y columnas. Glue Catalog + Lake Formation en AWS.
- 03.Nivel columna (column masking): ocultar columnas sensibles (email, DNI) para ciertos roles. El analista ve la tabla pero con PII enmascarada.
- 04.Nivel fila (row-level security): filtrar filas automáticamente según el rol. El gerente de España solo ve datos de España.
1# Ejemplo conceptual: definir permisos por zona y rol23permisos = {4 "data_engineer": {5 "raw": "read/write",6 "silver": "read/write",7 "gold": "read/write",8 },9 "data_analyst": {10 "raw": "none",11 "silver": "read (sin PII)",12 "gold": "read",13 },14 "data_scientist": {15 "raw": "none",16 "silver": "read",17 "gold": "read/write (solo feature store)",18 },19 "business_user": {20 "raw": "none",21 "silver": "none",22 "gold": "read (solo su departamento)",23 },24}2526for rol, accesos in permisos.items():27 print(f"\n{rol}:")28 for zona, permiso in accesos.items():29 print(f" {zona}: {permiso}")
Matriz de permisos por zona y rol — cada organización define la suya
### Data contracts: acuerdos entre productor y consumidor
Un data contract es un acuerdo formal entre quien produce los datos y quien los consume. Define: qué columnas tendrá la tabla, qué tipos, qué valores son válidos, con qué frecuencia se actualiza (SLA), y qué pasa si el contrato se rompe. Es como un API contract pero para datos.
1# Ejemplo de data contract como código (YAML conceptual en Python)23contract = {4 "name": "gold.metricas_diarias",5 "owner": "equipo-data-engineering",6 "consumers": ["equipo-bi", "equipo-finanzas"],7 "sla": {8 "freshness": "datos disponibles antes de las 08:00 UTC",9 "completeness": ">=99% de días con datos",10 "availability": "99.9% uptime",11 },12 "schema": {13 "fecha": {"type": "date", "nullable": False, "description": "Día de las métricas"},14 "revenue": {"type": "decimal(12,2)", "nullable": False, "min": 0},15 "num_pedidos": {"type": "int", "nullable": False, "min": 0},16 "ticket_medio": {"type": "decimal(8,2)", "nullable": False},17 },18 "breaking_changes": {19 "notification": "14 días de antelación",20 "approval_required_from": ["equipo-bi", "equipo-finanzas"],21 },22}2324print("=== DATA CONTRACT ===")25print(f"Tabla: {contract['name']}")26print(f"Owner: {contract['owner']}")27print(f"SLA: {contract['sla']['freshness']}")28print(f"Columnas: {list(contract['schema'].keys())}")
Data contract como código: define el acuerdo entre productor y consumidor
Sin data contracts, el productor puede cambiar una columna cualquier viernes por la tarde y romper los dashboards de toda la empresa el lunes. Lo he visto pasar. Muchas veces. Los contracts no son burocracia — son la diferencia entre un equipo que funciona y uno que vive apagando fuegos.
### Clasificación de datos: PII, confidencial, público
Clasificar los datos por sensibilidad es obligatorio para cumplir regulaciones como GDPR (Europa) o CCPA (California). Las clasificaciones típicas:
- PII (Personally Identifiable Information): nombre, email, DNI, teléfono, dirección. Requiere consentimiento y derecho al olvido.
- Confidencial: datos financieros, estrategia, salarios. Solo accesible para roles autorizados.
- Interno: datos de operaciones, métricas internas. Accesible para empleados.
- Público: datos que se pueden compartir externamente (catálogo de productos, precios públicos).
Cómo se ejecuta de verdad un borrado GDPR en un data lake con Iceberg o Delta: (1) identificas las filas con los datos personales del usuario, (2) las borras con un DELETE o las reescribes con MERGE (lección 7 — esto crea ficheros nuevos sin esas filas), (3) expiras los snapshots antiguos que aún referencian los ficheros con los datos originales (lección 6), (4) limpias los ficheros huérfanos que ya ningún snapshot necesita, y (5) verificas que los bytes han desaparecido del storage. Sin los pasos 3 y 4, el DELETE borra la fila de la vista actual pero los datos siguen vivos en disco dentro de los ficheros de snapshots anteriores.
Marca la clasificación de cada columna desde el día 1. Es infinitamente más fácil etiquetar 10 tablas nuevas que auditar 500 tablas legacy que llevan años sin clasificar. Los catálogos modernos pueden auto-detectar PII por patrones (regex de emails, DNIs), pero siempre necesitas validación humana.
### El data lake maduro: juntando todo
Un data lake maduro no es solo tecnología — es un sistema socio-técnico donde la tecnología, los procesos y las personas trabajan juntos. Has aprendido todas las piezas en esta skill. Juntémoslas en una visión completa:
- 01.Storage: S3 (o equivalente) con zonas raw/silver/gold bien definidas.
- 02.Formato: Parquet columnar con compresión Snappy y particionado inteligente.
- 03.Table format: Iceberg (o Delta) para ACID, time travel y schema evolution.
- 04.Catálogo: Glue Catalog, DataHub o equivalente para descubrimiento y linaje.
- 05.Permisos: IAM + Lake Formation (o equivalente) para control de acceso granular.
- 06.Contracts: definidos entre equipos para garantizar calidad y evitar breaking changes.
- 07.Monitorización: alertas de frescura, completitud y anomalías sobre las tablas gold.
## ejercicios
Diseñar un entry de catálogo
Diseña la entrada de catálogo para una tabla gold de métricas de un e-commerce. Debe incluir toda la metadata necesaria para que cualquiera entienda y use la tabla.
Implementar trazabilidad de linaje
Crea un sistema simple de linaje que registre las dependencias entre tablas y permita responder "de dónde viene este dato" y "qué se rompe si cambio esta tabla".
Validar un data contract
Implementa un validador que compruebe si una tabla cumple su data contract: esquema correcto, frescura, completitud y valores válidos.
Diseñar matriz de permisos del lake
Diseña e implementa un sistema de permisos role-based para un data lake con 4 roles y 3 zonas, incluyendo column-level security para PII.
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...