lección 6
Instalar Airflow con Docker: el estándar de la industria
Levanta Apache Airflow en tu máquina con Docker Compose. El orquestador que encontrarás en la mayoría de empresas.
⏱ 55 min
### ¿Por qué Airflow si ya tenemos Step Functions?
Empezamos con Step Functions porque es conceptualmente más simple: máquinas de estado, diagramas de flujo, JSON declarativo. Pero ahora necesitas conocer el estándar de la industria. Si buscas "data engineer" en LinkedIn, el 70% de las ofertas mencionan Airflow. No porque sea mejor que Step Functions — son herramientas diferentes para contextos diferentes — sino porque Airflow lleva más tiempo, es open source, funciona con cualquier cloud y tiene un ecosistema enorme.
Airflow nació en Airbnb en 2014. Los ingenieros de datos tenían docenas de pipelines en cron, se perdían dependencias, no había visibilidad de qué había corrido y qué no. Necesitaban algo que definiera dependencias entre tareas, las ejecutara en orden, registrara el historial y tuviera una UI para monitorizar. Así nació Airflow — y desde entonces se ha convertido en el estándar de facto.
La diferencia filosófica: Step Functions piensa en máquinas de estado (diagrama de flujo). Airflow piensa en DAGs — grafos dirigidos acíclicos. Son como un árbol genealógico: cada tarea sabe quién son sus padres (dependencias) y no puede haber ciclos (A depende de B que depende de A). El scheduler mira el grafo y ejecuta cada tarea cuando sus dependencias están satisfechas.
Airflow es potente pero complejo. Tiene un scheduler, un webserver, una base de datos de metadatos, workers, y un sistema de plugins. No te asustes por la cantidad de componentes — el docker compose los levanta todos por ti. Pero entiende que detrás de esa UI bonita hay un sistema distribuido serio.
### Paso 1: Crear la carpeta y el docker-compose.yml
Vamos a usar la versión "standalone" que es más simple para aprender (un solo contenedor en lugar de los 9 que tiene el compose oficial).
1# Crear carpeta para Airflow2mkdir -p airflow-lab/dags airflow-lab/logs airflow-lab/plugins3cd airflow-lab
Tres carpetas obligatorias: dags (tus pipelines), logs (output), plugins (extensiones)
1# docker-compose.yml para Airflow standalone2services:3 airflow:4 image: apache/airflow:2.8.1-python3.115 container_name: airflow-standalone6 environment:7 - AIRFLOW__CORE__EXECUTOR=SequentialExecutor8 - AIRFLOW__CORE__LOAD_EXAMPLES=False9 - AIRFLOW__WEBSERVER__EXPOSE_CONFIG=True10 - _AIRFLOW_DB_MIGRATE=true11 - _AIRFLOW_WWW_USER_CREATE=true12 - _AIRFLOW_WWW_USER_USERNAME=admin13 - _AIRFLOW_WWW_USER_PASSWORD=admin14 volumes:15 - ./dags:/opt/airflow/dags16 - ./logs:/opt/airflow/logs17 - ./plugins:/opt/airflow/plugins18 ports:19 - "8080:8080"20 command: airflow standalone21 healthcheck:22 test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]23 interval: 30s24 timeout: 10s25 retries: 5
Airflow standalone: scheduler + webserver + DB en un solo contenedor. Perfecto para aprender.
Este docker compose hace varias cosas: crea un usuario admin/admin para la UI web, desactiva los DAGs de ejemplo (que son confusos para principiantes), usa SequentialExecutor (un solo worker — suficiente para aprender), y monta tus carpetas locales como volúmenes.
### Paso 2: Levantar Airflow
1# Levantar Airflow (la primera vez tarda 1-2 minutos en inicializar la DB)2docker compose up -d34# Ver los logs mientras arranca5docker compose logs -f airflow67# Esperar hasta ver algo como:8# "Airflow is ready"9# "webserver | [INFO] Listening at: http://0.0.0.0:8080"1011# Verificar que está healthy12docker ps13# STATUS: Up X minutes (healthy)
La primera vez descarga ~1GB de imagen. Las siguientes veces arranca en segundos.
### Paso 3: Acceder a la interfaz web
Abre tu navegador en http://localhost:8080. Verás el login de Airflow. Credenciales: admin / admin. Una vez dentro, verás el dashboard de DAGs (vacío porque aún no hemos creado ninguno).
Si admin/admin no te deja entrar, es que el modo standalone genero una contrasena aleatoria en vez de usar la del compose. La encuentras asi: docker exec airflow-standalone cat /opt/airflow/standalone_admin_password.txt
La UI de Airflow es una de sus grandes ventajas sobre Step Functions: puedes ver el historial de ejecuciones de cada DAG, los logs de cada tarea, el estado actual, y lanzar/pausar DAGs con un click. Es como un centro de control para todos tus pipelines.
Si vienes de Step Functions, la UI de Airflow te va a parecer otro nivel. Step Functions tiene una consola visual, sí, pero Airflow tiene calendario de ejecuciones, gráficos de duración, logs inline, y una vista Gantt que muestra el paralelismo. Es adictivamente visual.
### Paso 4: Tu primer DAG — Hello World
Un DAG en Airflow es un archivo Python que vive en la carpeta dags/. Airflow escanea esa carpeta cada 30 segundos buscando archivos que definan DAGs. Vamos a crear el más simple posible:
1# dags/hello_world.py2from datetime import datetime3from airflow import DAG4from airflow.operators.python import PythonOperator56def saludar():7 """Función que ejecutará nuestra tarea."""8 print("¡Hola desde Airflow! El orquestador está funcionando.")9 return "Saludo completado"1011# Definir el DAG12with DAG(13 dag_id='hello_world',14 description='Mi primer DAG — verifica que Airflow funciona',15 start_date=datetime(2024, 1, 1),16 schedule=None, # Solo se ejecuta manualmente (por ahora)17 catchup=False,18 tags=['tutorial'],19) as dag:2021 tarea_saludo = PythonOperator(22 task_id='saludar',23 python_callable=saludar,24 )
Guarda esto en airflow-lab/dags/hello_world.py. En 30 segundos aparecerá en la UI.
Desglosemos el código: with DAG(...) define el contenedor del pipeline. Dentro creamos tareas usando Operators (en este caso PythonOperator, que ejecuta una función Python). El schedule=None significa que no se ejecuta automáticamente — lo lanzamos a mano desde la UI. catchup=False evita que ejecute todas las fechas pasadas desde start_date.
### Paso 5: Ejecutar y verificar
1# Verificar que Airflow detectó el DAG2docker exec airflow-standalone airflow dags list34# Deberías ver:5# dag_id | filepath | owner | paused6# hello_world | hello_world.py | airflow | True78# Activar el DAG (despausa)9docker exec airflow-standalone airflow dags unpause hello_world1011# Ejecutar manualmente12docker exec airflow-standalone airflow dags trigger hello_world1314# Ver el estado de la última ejecución15docker exec airflow-standalone airflow dags list-runs -d hello_world
También puedes hacer todo esto desde la UI web en http://localhost:8080
Si vas a la UI web y haces click en hello_world → Graph, verás tu DAG como un grafo con un solo nodo verde (éxito). Haz click en el nodo → Log para ver el print de tu función. Si ves "¡Hola desde Airflow!", tu instalación está completa.
### Estructura de Airflow: qué componentes están corriendo
- Scheduler: el cerebro. Escanea los DAGs, decide qué tareas deben ejecutarse según el schedule y las dependencias.
- Webserver: la UI web en el puerto 8080. Solo monitorización y control manual.
- Metadata DB (SQLite en standalone): almacena historial de ejecuciones, estado de tareas, configuración.
- Executor: el motor que ejecuta las tareas. SequentialExecutor las ejecuta una a una (suficiente para aprender).
En producción verás CeleryExecutor o KubernetesExecutor (ejecutan tareas en paralelo en múltiples workers). Para aprender, SequentialExecutor es perfecto porque es más fácil de debuggear — una tarea a la vez, logs claros, sin concurrencia.
Requisito de memoria: Airflow necesita al menos 4 GB de RAM asignados a Docker (ideal 8 GB). En Docker Desktop el valor por defecto suele ser 2 GB. Si Airflow arranca y se muere, o el scheduler entra en bucle, mira primero la memoria asignada en Settings > Resources. En Windows, Airflow no corre en nativo: necesitas Docker Desktop con WSL2.
La version esta clavada en apache/airflow:2.8.1-python3.11 a proposito, y no es solo higiene. La version estable de hoy es Airflow 3, y tres piezas de esta leccion no existen alli: PythonOperator se importa de otro paquete, el SequentialExecutor se ha eliminado, y el webserver se llama api-server. Todo lo que aprendes aqui vale igual — DAGs, operadores, dependencias — pero si pones :latest te vas a encontrar imports que no compilan. Cuando quieras dar el salto, busca la guia "Upgrading to Airflow 3".
Una cosa que ya estas haciendo sin saberlo: cuando tu funcion devuelve un valor (como {"registros": 1000}), Airflow lo guarda en XCom, su buzon interno para pasar valores pequenos entre tareas. La siguiente tarea lo puede leer con ti.xcom_pull(task_ids="extraer"). Ojo: XCom va a la base de datos de metadatos, asi que ahi viajan contadores, rutas de S3 e ids — nunca los datos. Es la misma regla que en Step Functions. Lo veras en detalle en la siguiente leccion.
### Comandos útiles del día a día
1# Listar DAGs disponibles2docker exec airflow-standalone airflow dags list34# Ejecutar un DAG manualmente5docker exec airflow-standalone airflow dags trigger <dag_id>67# Ver estado de tareas de una ejecución8docker exec airflow-standalone airflow tasks list <dag_id>910# Pausar/despausar un DAG11docker exec airflow-standalone airflow dags pause <dag_id>12docker exec airflow-standalone airflow dags unpause <dag_id>1314# Ver logs de una tarea específica15docker exec airflow-standalone airflow tasks test <dag_id> <task_id> <logical_date>16# Ejecuta la tarea al momento e imprime su salida (no crea DagRun)1718# Los logs de ejecuciones pasadas estan en la carpeta que montaste:19# ls logs/dag_id=<dag_id>/2021# Parar Airflow22docker compose down2324# Parar y borrar todo (incluida la DB)25docker compose down -v
Referencia rápida de comandos Airflow en Docker
## ejercicios
Verificar la instalación de Airflow
Escribe los comandos para: 1) levantar Airflow, 2) verificar que el webserver responde, 3) listar DAGs disponibles, 4) ejecutar el DAG hello_world.
Crear un DAG con dos tareas encadenadas
Crea un DAG llamado "dos_pasos" con dos PythonOperators: "extraer" (print los datos) y "cargar" (print que se cargaron). La tarea cargar debe depender de extraer.
DAG con tareas en paralelo
Crea un DAG donde "extraer" va primero, luego "limpiar" y "validar" se ejecutan en paralelo, y finalmente "cargar" espera a ambas. Forma de diamante.
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...