¿Qué hace Construcción de Pipelines de Ingestión?
Cuándo usar
- Extrayendo desde bases de datos, APIs, archivos o SaaS hacia un almacén/lago de datos.
- Diseñando extracción incremental, marcas de agua o CDC.
- Manejando paginación de API, límites de tasa y reintentos.
- Decidiendo entre EL gestionado (Fivetran/Airbyte) vs código personalizado.
- NO usar para transformar datos ya aterrizados (usar habilidades de dbt/Spark).
Flujo de trabajo
- [ ] Decidir modo de extracción: instantánea completa vs incremental vs CDC
- [ ] Elegir una marca de agua alta confiable (updated_at, LSN/binlog, secuencia)
- [ ] Aterrizar datos crudos de forma inmutable (anexar), luego transformar aguas abajo
- [ ] Hacer la carga idempotente (upsert/sobrescritura de partición por clave)
- [ ] Manejar paginación, límites de tasa, reintentos y datos tardíos
- Elegir el modo. Recarga completa (tablas pequeñas/de dimensión), incremental mediante una marca de agua alta (la mayoría de las tablas de hechos), o CDC (OLTP de alto volumen donde se necesitan eliminaciones y cada cambio).
- Elegir una marca de agua confiable.
updated_atsolo funciona si la fuente siempre lo actualiza; de lo contrario, usar posiciones de registro de BD (LSN/binlog/SCN) o una secuencia monótona. Almacenar la última marca de agua y reanudar desde ella. - Aterrizar datos crudos de forma inmutable. Anexar extractos crudos (bronce) con metadatos de carga; hacer transformaciones aguas abajo para poder reproducir sin volver a extraer la fuente.
- Carga idempotente. Upsert por clave natural o sobrescribir la partición, para que
los reintentos y superposiciones no dupliquen (ver
writing-idempotent-transformations). - Ser robusto ante paginación, límites de tasa y datos tardíos.
Patrones
Extracción incremental con superposición para datos tardíos:
-- Extraer una pequeña ventana de superposición más allá de la última marca de agua para capturar actualizaciones tardías,
-- luego upsert por clave para que la superposición no cree duplicados.
SELECT * FROM source.orders
WHERE updated_at >= :last_watermark - INTERVAL '3 days';
CDC — leer el registro de la base de datos (Debezium/nativo) para capturar inserciones, actualizaciones y eliminaciones (que la extracción basada en marcas de agua no detecta). Aplicar cambios con MERGE, usando la posición de confirmación del cambio para ordenar.
Paginación de API + límites de tasa — seguir tokens de cursor/siguiente página; retroceder y reintentar en 429/5xx con retroceso exponencial y jitter; marcar progreso para que un fallo reanude a medio camino.
Gestionado vs personalizado — usar Fivetran/Airbyte para conectores estándar (manejan deriva de esquema, estado incremental, reintentos); escribir personalizado solo para fuentes inusuales o necesidades estrictas de control/costo.
Errores comunes
- Marca de agua
updated_atcuando la fuente no la establece de forma confiable — silenciosamente pierde filas; validar o cambiar a CDC basado en registro. - Sin ventana de superposición — las actualizaciones tardías se pierden entre ejecuciones.
- Extracción basada en marcas de agua esperando eliminaciones — no puede verlas; usar CDC o reconciliación completa periódica.
- Transformar durante la extracción — imposibilita la reproducción; aterrizar crudo primero.
- Ignorar límites de tasa/casos extremos de paginación — extracciones parciales que parecen completas; marcar progreso y verificar conteos.
- Carga no idempotente — los reintentos y ventanas de superposición duplican filas.