Cómo usar Airflow: Una guía práctica e integral para construir pipelines de datos confiables
Si mueves datos u orquestas trabajos de ML, es probable que hayas escuchado el mismo estribillo: "Simplemente ponlo en Airflow". La verdad es que Apache Airflow brilla cuando necesitas visibilidad, confiabilidad y control sobre flujos de trabajo complejos. En esta guía práctica, te guiaremos paso a paso sobre cómo usar Airflow, desde los conceptos básicos hasta los patrones listos para producción, para que puedas enviar pipelines en los que confíes.
Lo mantendremos práctico: obtendrás un modelo mental para DAGs y tareas, ejemplos prácticos con la API TaskFlow, opciones de implementación, estrategias de prueba y mejores prácticas. Al final, pasarás de "Puedo ejecutar el tutorial" a "Puedo ejecutar esto en producción".
Nota: Para inmersiones más profundas y referencias, la documentación oficial es excelente y se actualiza regularmente.
¿Qué es Apache Airflow, realmente?
Airflow es un orquestador, no un procesador de datos. Programa, ordena y supervisa el trabajo que ejecutas en otro lugar (bases de datos, almacenes, trabajos de Spark, APIs, contenedores). Defines los flujos de trabajo como DAGs (Directed Acyclic Graphs), que son solo archivos de Python que codifican las tareas y sus dependencias. Airflow luego ejecuta esas tareas de acuerdo con tu programación, parámetros y entorno.
- DAG: La definición del flujo de trabajo (gráfico de tareas con dependencias).
- Tarea: Una unidad de trabajo (función de Python, ejecución de SQL, comando Bash, disparador de trabajo externo, etc.).
- Operador: Una plantilla para un tipo de tarea (p. ej.,
PythonOperator, BashOperator, KubernetesPodOperator).
- Scheduler: Decide qué ejecutar y cuándo.
- Executor: Ejecuta tareas (localmente, con Celery, Kubernetes, etc.).
- UI: Tu centro de control para ejecuciones, registros, reintentos y linaje.
Comienza con los tutoriales oficiales una vez que hayas instalado Airflow; te darán una visión general rápida.
Instalación y ejecución de Airflow de la manera correcta
Airflow es flexible. Elige el camino que coincida con tu etapa:
- Desarrollo local (inicio rápido):
- Usa el Docker Compose de inicio rápido proporcionado por el proyecto. Pone en marcha el servidor web, el scheduler, la base de datos y más con valores predeterminados sensatos.
- Ideal para aprender e iterar en DAGs.
- Equipo pequeño o staging:
- Celery Executor o Kubernetes Executor con un Postgres administrado.
- Almacena los registros en S3/GCS y empaqueta las dependencias con tu imagen o
requirements.txt.
- Kubernetes Executor para elasticidad o Celery Executor con trabajadores de escalado automático.
- Secretos externos (Vault), observabilidad robusta (registros + métricas) e implementaciones blue/green para actualizaciones.
Consejo: Mantén tu base de código de Airflow controlada por versiones, en contenedores y probada antes de la promoción. La página de "Mejores prácticas" describe los patrones listos para producción.
Conceptos básicos que usarás a diario
DAGs: Tu flujo de trabajo como código
Un DAG es un archivo de Python que define:
- Metadatos del DAG: id, programación, fecha de inicio, etiquetas.
- Argumentos predeterminados: reintentos, propietarios, SLAs.
- Tareas y sus dependencias.
Piensa en un DAG como el "qué" y el "cuándo", y en las tareas como el "cómo".
Tareas y operadores
Los operadores son prefabricados para tareas comunes. Ejemplos:
- PythonOperator / TaskFlow
@task para código Python
- BashOperator para comandos de shell
- SimpleHttpOperator para APIs
- KubernetesPodOperator para trabajos en contenedores
- Proveedores de SQL (p. ej., Snowflake, BigQuery, Postgres) para trabajo de almacén
API TaskFlow: La forma moderna y Pythonica
La API TaskFlow te permite escribir tareas como funciones de Python con @task, devolver valores que pasan a través de XCom y componerlos limpiamente. Reduce el boilerplate y mejora la legibilidad, muy recomendable.
Tu primer DAG de Airflow (Edición TaskFlow)
A continuación, se muestra un ejemplo mínimo de estilo ETL para ilustrar las ideas clave: programación, TaskFlow, dependencias y paso de datos XCom.
from datetime import datetime
from airflow import DAG
from airflow.decorators import task
with DAG(
dag_id="weather_etl_example",
start_date=datetime(2024, 1, 1),
schedule="0 * * * *", # hourly
catchup=False,
tags=.
Programación, Catchup y Backfills
schedule: Cron o presets (@daily, @hourly).
start_date + catchup: Si catchup=True, Airflow rellenará las ejecuciones desde la fecha de inicio. Para pipelines de estilo streaming, establece catchup=False.
- Backfills manuales: Usa la UI o CLI para volver a ejecutar intervalos históricos.
Regla práctica: habilita catchup para trabajos por lotes deterministas; deshabilita para pipelines en tiempo real o con límite de velocidad de API.
Pasar datos entre tareas (XCom) de forma segura
- Objetos pequeños: los valores de retorno con TaskFlow están bien.
- Cargas útiles grandes: almacena en almacenamiento de objetos (S3/GCS) con una clave en XCom.
- Evita datos confidenciales en XCom; usa backends de secretos (p. ej., Vault) y variables de entorno.
Mapeo dinámico de tareas y cargas de trabajo de Fan-out
Airflow puede generar tareas dinámicamente en tiempo de ejecución en función de las entradas, ideal para conjuntos de datos particionados o trabajos multi-tenant.
- Mantén los DAGs deterministas e idempotentes.
- Separa la orquestación (Airflow) del cómputo (Spark, dbt, almacenes).
- Usa la API TaskFlow para mayor claridad e higiene de XCom.
- Parametriza los DAGs; usa variables con criterio.
- Supervisa, alerta y documenta tus pipelines.
Cómo trabajar con almacenes de datos y ML
- Almacenes de datos: Usa operadores de proveedor (p. ej., SnowflakeOperator, BigQueryInsertJobOperator) para trabajos SQL. Almacena SQL en archivos o módulos versionados.
- dbt: Activa dbt a través de Bash/KubernetesPodOperator o operadores dbt dedicados en proveedores.
- ML: Orquesta la generación de características, el entrenamiento y la inferencia por lotes como tareas separadas; almacena en caché los artefactos en el almacenamiento y registra las métricas.
Programación avanzada: Conjuntos de datos y dependencias entre DAGs
- Los conjuntos de datos permiten que un DAG produzca un conjunto de datos lógico que desencadena otro DAG cuando se actualiza, más limpio que los desencadenadores ad-hoc.
- Para patrones heredados, ExternalTaskSensor funciona, pero los conjuntos de datos son más declarativos.
Seguridad y cumplimiento
- Usa el control de acceso basado en roles (RBAC) en la UI.
- Aísla los entornos por equipo o límite de confianza.
- Mantén los registros de auditoría a través de registros e historial de cambios de conexión.
Actualizaciones y control de versiones
- Prueba las actualizaciones en staging con cargas de trabajo similares a las de producción.
- Fija y actualiza los proveedores deliberadamente.
- Lee las notas de la versión para ver los cambios y las obsolescencias específicas del executor.
Una lista de verificación rápida para tu primer DAG de producción
- Propiedad clara (etiqueta
owner) y alertas configuradas.
retries configurado con retrocesos razonables.
- Tareas idempotentes y dependencias explícitas.
- Pequeñas cargas útiles de XCom; datos grandes en el almacenamiento.
- Registros enviados al almacenamiento duradero; métricas exportadas.
- Plan de lanzamiento (canario o blue/green) y pasos de reversión.
Ejemplo: Un DAG de carga de almacén realista
Este patrón extrae archivos diarios, los valida y los carga en una tabla de almacén, con mapeo dinámico por partición y sensores diferibles.
from datetime import datetime
from airflow import DAG
from airflow.decorators import task
from airflow.sensors.filesystem import FileSensor
- Revisa las mejores prácticas antes de promocionar a producción.
- Explora la documentación del proveedor para tus sistemas (almacenes, nubes, herramientas de ML).
Por cierto: Acelera la creación con un compañero de IA
Vale la pena señalar: si redactas muchos DAGs, un asistente de IA que entienda el código puede acelerar el boilerplate, generar stubs de TaskFlow e incluso sugerir correcciones de dependencias. Si quieres un ayudante ligero junto a tu editor y navegador, Sider.AI puede ser útil para reescrituras y explicaciones rápidas de código durante el desarrollo. Conclusiones clave
- Usa Airflow para orquestar, no para computar.
- Prefiere la API TaskFlow para DAGs limpios y comprobables.
- Mantén los datos fuera de XCom; pasa referencias en su lugar.
- Usa sensores/operadores diferibles para guardar slots.
- Conteneriza, prueba y promociona a través de entornos.
- Confía en los tutoriales oficiales y las mejores prácticas como tu estrella del norte.
Preguntas frecuentes
Q1:¿Cuál es la forma más fácil de aprender a usar Airflow?
Comienza con el Tutorial oficial para comprender los DAGs, las tareas, la programación y la UI. Luego, construye un pequeño pipeline basado en TaskFlow e itera con la guía de mejores prácticas para estar listo para la producción.
Q2:¿Debo usar la API TaskFlow u operadores clásicos en Airflow?
Usa la API TaskFlow para la mayoría de los pipelines Pythonicos porque es más limpia y maneja los retornos de XCom de forma natural. Los operadores clásicos siguen siendo excelentes para tareas que no son de Python como Bash, SQL o trabajos de contenedor.
Q3:¿Cómo paso grandes cantidades de datos entre tareas de Airflow?
Evita poner grandes cargas útiles en XCom. Almacena los datos en S3/GCS o en una base de datos y pasa solo referencias o URIs a través de XCom para mantener las tareas rápidas y confiables.
Q4:¿Qué executor debo elegir para Airflow en producción?
Para la elasticidad y el aislamiento, Kubernetes Executor es un valor predeterminado sólido. Para configuraciones más simples, Celery Executor funciona bien, solo asegúrate de que haya escalado automático, un registro robusto y secretos externalizados.
Q5:¿Cómo manejo las dependencias entre múltiples DAGs de Airflow?
Usa Datasets para desencadenadores declarativos entre DAGs cuando un pipeline produce datos para otro. Alternativamente, ExternalTaskSensor puede coordinar las ejecuciones, pero los Datasets son más limpios para la orquestación basada en datos.