Saltar al contenido

Lección 7 de 21 · Lectura y práctica

Configurar Dependencias con set_upstream y set_downstream

Compara >>, <<, set_upstream y set_downstream con un DAG de cuatro tareas comprobado en Python 3.12.3 y Airflow 3.3.2.

Del concepto a la práctica

Taller de esta lección

Las dependencias describen precedencia, no contenido. Con cuatro tareas extraer, validar, transformar y publicar, puedes expresar la misma relación con >> o con set_downstream, pero no necesitas duplicarla. Un grafo correcto permite paralelismo cuando dos tareas no comparten una condición previa.

Ejemplo resuelto

extraer_clientes y extraer_pedidos pueden ejecutarse en paralelo; ambas deben preceder a unir. Si unir solo depende de clientes, podría comenzar con información incompleta.

Pruébalo

  1. Dibuja nodos antes de escribir código.

  2. Marca cada requisito de entrada de unir.

  3. Expresa una relación con >> y otra con set_downstream.

  4. Busca ciclos antes de ejecutar.

Comprueba tu resultado

El grafo tiene dos ramas de extracción y un único punto de unión sin ciclos.

Error frecuente

Confundir extraer >> transformar con el envío de un DataFrame. Corrige usando archivo compartido o un intercambio pequeño y explícito.

Ejercicio: añade auditar después de publicar. Resultado esperado: publicar termina antes de auditar, y ninguna tarea de extracción depende innecesariamente de la auditoría.

Condición concreta de convergencia

El grafo es extraer_clientes >> unir y extraer_pedidos >> unir; ambas relaciones son necesarias. En la regla predeterminada all_success, si clientes termina bien y pedidos falla, unir no ejecuta su código y queda en upstream_failed. El paralelismo depende además de la capacidad disponible; ausencia de dependencia no promete ejecución simultánea. Las rutas de archivos grandes deben ser accesibles desde cualquier worker que ejecute la tarea siguiente, o apuntar a almacenamiento compartido. No supongas que /tmp de un worker pertenece también a otro.

Grafo acíclico con extracción, validación, transformación, carga y publicación, incluyendo dos dependencias de entrada.
CursaloMapa de práctica
Dependencias antes que horarios

Un 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 ↗

Orden de ejecución, sin confundirlo con el flujo de datos

Si extraer debe terminar antes de validar, crea una dependencia dirigida entre las dos tareas. Airflow representa ese orden en un DAG: un grafo sin ciclos. Una dependencia no copia un archivo ni transmite automáticamente el resultado; para eso necesitas un mecanismo de datos, como los valores de TaskFlow/XCom o un almacén compartido apropiado.

Esta práctica usa Python 3.12 y Apache Airflow 3.3.2. La documentación de esta versión recomienda >> y << para dependencias individuales. Los métodos explícitos set_upstream y set_downstream siguen siendo válidos. «Recomendado» no significa que esos métodos estén retirados.

Cuatro formas equivalentes de una relación

Estas líneas, por separado, expresan extraer → validar. Elige una para esa relación; no hace falta repetir las cuatro en el mismo archivo.

extraer >> validar
validar << extraer
extraer.set_downstream(validar)
validar.set_upstream(extraer)

Un DAG completo para comprobar el grafo

Guarda este archivo como dependencias_cursalo.py. Sus tareas vacías sirven para comprobar las relaciones sin acceder a servicios externos, enviar correos ni modificar datos de clientes. El grafo esperado es extraer → validar → transformar → guardar.

from datetime import datetime, timezone
from airflow.sdk import DAG
from airflow.providers.standard.operators.empty import EmptyOperator

with DAG(
    dag_id="dependencias_cursalo",
    start_date=datetime(2026, 1, 1, tzinfo=timezone.utc),
    schedule=None,
    catchup=False,
    default_args={"retries": 0},
) as dag:
    extraer = EmptyOperator(task_id="extraer")
    validar = EmptyOperator(task_id="validar")
    transformar = EmptyOperator(task_id="transformar")
    guardar = EmptyOperator(task_id="guardar")

    extraer.set_downstream(validar)
    transformar.set_upstream(validar)
    transformar >> guardar

if __name__ == "__main__":
    dag.test()

Preparar y ejecutar una práctica aislada

Trabaja en una carpeta propia de la lección, con el archivo anterior. El directorio .airflow-practica guarda la base de metadatos y los logs de este ejercicio; no uses la configuración o la base de datos de un servicio existente. La serialización registra los DAG antes de crear la ejecución de prueba en esta versión.

python3.12 -m venv .venv
.venv/bin/python -m pip install apache-airflow==3.3.2 \
  --constraint https://raw.githubusercontent.com/apache/airflow/constraints-3.3.2/constraints-3.12.txt
export AIRFLOW_HOME="$PWD/.airflow-practica"
export AIRFLOW__CORE__DAGS_FOLDER="$PWD"
export AIRFLOW__CORE__LOAD_EXAMPLES=False
.venv/bin/airflow db migrate
.venv/bin/airflow dags reserialize
.venv/bin/python dependencias_cursalo.py

En la verificación del 2 de octubre de 2026 se importó este DAG con Python 3.12.3 y Airflow 3.3.2, se comprobó el grafo de cuatro tareas y se ejecutó la prueba local con las cuatro tareas y el DAG en estado success. Esta comprobación no es una prueba de rendimiento, de un scheduler de producción o de un clúster.

Errores que debes poder explicar

  • Un ciclo: guardar >> extraer cerraría el circuito. El grafo debe seguir siendo acíclico.
  • Orden y datos: una dependencia permite esperar a otra tarea, pero no entrega sus archivos por sí sola.
  • Tarea independiente: una tarea sin relación con las otras puede ser elegible por separado; no es cierto que Airflow solo ejecute tareas alcanzables desde una única raíz.
  • Listas: inicio >> [a, b] crea dos relaciones; conectar listas completas puede necesitar chain o cross_downstream, según el grafo deseado.
  • Importaciones: en esta práctica usa airflow.sdk y el operador de airflow.providers.standard; no mezcles importaciones de tutoriales de Airflow 1.x con la versión fijada.

Ejercicio y criterio de revisión

Añade una tarea vacía revisar entre transformar y guardar. Dibuja las cuatro flechas esperadas, comprueba los identificadores de cada tarea y repite la prueba. Entrega el archivo, las versiones y el estado final; no anotes «probado» solo porque el archivo se pudo importar.

Consulta también la guía de TaskFlow para una práctica posterior con valores entre tareas. Guarda los logs en el directorio de este ejercicio. Para reiniciar, elimina únicamente su carpeta .airflow-practica después de detener cualquier proceso de práctica que hayas abierto; conserva el código y no apuntes la limpieza a otro servicio.

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.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.