Lección 3 de 21 · Lectura y práctica
Crear tu Primer DAG con Operadores Básicos
Tipo de lección: VideoConcepto claveUn DAG (Grafo Acíclico Dirigido) en Apache Airflow es la unidad fundamental de orquestación que define un flujo de trabajo de datos. Piensa en él como un plano arquitectónico para tu pipeline.
Del concepto a la práctica
Taller de esta lección
Un DAG útil separa definición, trabajo y orden. Para un flujo de tres pasos, preparar puede crear un archivo local, contar leerlo y resumir registrar el resultado. El operador ejecuta una tarea; la flecha solo declara que una tarea debe terminar antes que otra. El archivo o XCom debe elegirse explícitamente si hay datos que transferir.
Ejemplo resuelto
Con dos registros, preparar escribe A,4 y B,6; contar suma 10; resumir imprime total=10. La salida esperada nace de los datos, no de un mensaje decorativo.
Pruébalo
Define un
start_datefijo y desactiva ejecuciones históricas no deseadas.Crea tres tareas con identificadores únicos.
Declara
preparar >> contar >> resumir.Ejecuta manualmente y revisa el log de cada tarea.
Comprueba tu resultado
Los estados son exitosos y el último log contiene total=10.
Error frecuente
Usar datetime.now() como fecha inicial. Corrige con una fecha fija para que la programación sea reproducible.
Ejercicio: sustituye los valores por 3, 8 y 9 y adapta el cálculo. Resultado esperado: total=20, visible en el log, con las tres tareas ejecutadas en orden.
DAG mínimo completo para Airflow 3
Este ejemplo intercambia únicamente una lista y un total pequeños mediante TaskFlow; no requiere un archivo compartido ni conexiones:
from datetime import datetime, timezone
from airflow.sdk import dag, task
@dag(dag_id="cursalo_total_local", schedule=None,
start_date=datetime(2026, 1, 1, tzinfo=timezone.utc),
catchup=False, default_args={"retries": 0})
def flujo():
@task
def preparar():
return [4, 6]
@task
def contar(valores):
return sum(valores)
@task
def resumir(total):
print(f"total={total}")
resumir(contar(preparar()))
flujo()Guárdalo como dags/total_local.py. El nombre del archivo no tiene que coincidir con dag_id; el identificador sí debe ser único. Cambia solamente la lista a [3, 8, 9] para comprobar 20. En Airflow 3 los imports públicos del DAG y los decoradores provienen de airflow.sdk; schedule sustituye el parámetro histórico schedule_interval. TaskFlow oficial.

Mapa de prácticaUn DAG expresa dependencias entre tareas, sin ciclos. Una transformación puede esperar a varias entradas y la publicación debe esperar a que la carga esté lista. El orden depende de los datos necesarios, no solo de una hora del reloj.
Ver la infografía en tamaño completo ↗Tipo de lección: Video
Concepto clave
Un DAG (Grafo Acíclico Dirigido) en Apache Airflow es la unidad fundamental de orquestación que define un flujo de trabajo de datos. Piensa en él como un plano arquitectónico para tu pipeline ETL: especifica qué tareas deben ejecutarse, en qué orden y bajo qué condiciones. La clave está en "acíclico" - las tareas no pueden crear bucles infinitos, asegurando que el flujo siempre avance hacia una conclusión.
Los operadores son los componentes que ejecutan el trabajo real dentro de un DAG. Cada operador representa una tarea única, como ejecutar un script Python, consultar una base de datos o copiar archivos. Airflow viene con operadores predefinidos para tareas comunes, pero también puedes crear los tuyos. La magia ocurre cuando conectas estos operadores con dependencias, creando un flujo de datos automatizado y confiable.
Cómo funciona en la práctica
Vamos a construir un DAG simple que descarga datos de una API, los procesa y los carga a una base de datos. Primero, necesitas entender la estructura básica:
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
def descargar_datos():
# Lógica para descargar datos
print("Datos descargados")
def procesar_datos():
# Lógica para procesar
print("Datos procesados")
def cargar_datos():
# Lógica para cargar
print("Datos cargados")
with DAG(
dag_id="mi_primer_dag",
start_date=datetime(2024, 1, 1),
schedule_interval="@daily"
) as dag:
t1 = PythonOperator(
task_id="descargar",
python_callable=descargar_datos
)
t2 = PythonOperator(
task_id="procesar",
python_callable=procesar_datos
)
t3 = PythonOperator(
task_id="cargar",
python_callable=cargar_datos
)
t1 >> t2 >> t3Este DAG se ejecutará diariamente desde el 1 de enero de 2024. Las tareas se ejecutan en secuencia: primero descarga, luego procesa, finalmente carga. Los operadores PythonOperator ejecutan funciones Python, pero Airflow tiene docenas de operadores para diferentes tecnologías.
Caso de estudio
Imagina que trabajas en un e-commerce que necesita actualizar diariamente el inventario. Cada noche, un sistema externo genera un archivo CSV con las ventas del día. Tu pipeline debe:
- Descargar el archivo CSV desde un servidor SFTP
- Validar que el archivo tenga el formato correcto
- Transformar los datos para calcular inventario actualizado
- Cargar los resultados a la base de datos de producción
- Enviar un reporte por email si hay productos con stock bajo
Con Airflow, crearías un DAG con estos operadores:
| Tarea | Operador | Descripción |
|---|---|---|
| descargar_archivo | SFTPOperator | Descarga CSV desde servidor remoto |
| validar_formato | PythonOperator | Verifica estructura del CSV |
| calcular_inventario | PythonOperator | Procesa datos y calcula nuevo inventario |
| actualizar_bd | PostgresOperator | Inserta datos en base de datos |
| enviar_alerta | EmailOperator | Envía email si stock < 10 unidades |
En producción, siempre agrega manejo de errores y logging detallado. Un pipeline sin monitoreo es como volar a ciegas.
Errores comunes
- Olvidar el start_date: Airflow necesita una fecha de inicio para programar ejecuciones. Si usas datetime.now(), el DAG nunca se ejecutará porque la fecha siempre está en el futuro.
- Dependencias circulares: Crear tareas que dependen unas de otras en ciclo. Ejemplo: t1 >> t2 >> t3 >> t1. Airflow lo detectará y fallará.
- No definir schedule_interval: Si no especificas cuándo debe ejecutarse el DAG, solo correrá manualmente. Para ejecución automática, define intervalos como "@daily" o "0 2 * * *" (cron).
- Operadores bloqueantes: Usar operadores que no liberan recursos. En producción, usa operadores asíncronos o configura tiempos de espera apropiados.
- Ignorar idempotencia: Las tareas deben poder ejecutarse múltiples veces sin efectos secundarios. Siempre diseña tus pipelines para ser idempotentes.
Checklist de dominio
- Puedo crear un DAG básico con al menos 3 tareas conectadas
- Entiendo la diferencia entre DAG, operador y tarea
- Sé cómo definir schedule_interval para ejecución automática
- Puedo usar al menos 2 tipos diferentes de operadores (PythonOperator y otro)
- Comprendo cómo Airflow maneja las dependencias entre tareas
- Sé dónde colocar mis DAGs para que Airflow los detecte
- Puedo verificar la validez de un DAG usando airflow dags list
Construye un DAG para procesamiento de logs diarios
En este ejercicio, crearás un DAG que procesa logs de aplicación diarios. Sigue estos pasos:
- Crea un nuevo archivo Python en la carpeta dags/ de tu instalación de Airflow
- Define un DAG llamado "procesar_logs_diarios" que se ejecute diariamente a las 3 AM
- Implementa tres tareas usando PythonOperator:
- extraer_logs: Simula extraer logs del día anterior (puede ser una función que imprima "Extrayendo logs")
- filtrar_errores: Filtra solo los logs de tipo ERROR (función que imprima "Filtrando errores")
- generar_reporte: Crea un resumen de errores (función que imprima "Generando reporte")
- Establece las dependencias para que las tareas se ejecuten en el orden correcto
- Verifica tu DAG ejecutando:
airflow dags list | grep procesar_logs_diarios - Prueba una ejecución manual con:
airflow dags test procesar_logs_diarios 2024-01-01
Una vez completado, tu DAG debería aparecer en la interfaz web de Airflow y poder ejecutarse automáticamente cada día.
Pistas
- Recuerda importar los módulos necesarios: DAG, PythonOperator y datetime
- Usa el operador >> para definir dependencias: tarea1 >> tarea2 >> tarea3
- Asegúrate de que el dag_id en el DAG coincida con el nombre del archivo sin la extensión .py
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Apache Airflow: Orquestación de Pipelines ETL Complejos con DAGs
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.