컨테이너·워크플로우 자동화/Airflow로 워크플로우 자동화하기

Airflow ExternalTaskMarker 이해하기

Data Jun 2025. 10. 19. 08:05

ExternalTaskMarker**는

“이 태스크는 다른 DAG의 특정 태스크와 연결되어 있다”

표식(Marker) 을 남기는 오퍼레이터입니다.

 

즉, ExternalTaskSensor가 기다리는 쪽이라면
ExternalTaskMarker는 기다림의 대상이 되는 쪽이에요.

 

1. 예시 상황

두 DAG이 있다고 해봅시다 👇

  • upstream_dag: 데이터 전처리
  • downstream_dag: 전처리 끝나야 모델 학습

✅ 1. upstream_dag.py

from airflow import DAG
from airflow.operators.dummy import DummyOperator
from airflow.sensors.external_task import ExternalTaskMarker
from datetime import datetime

with DAG(
    dag_id='upstream_dag',
    start_date=datetime(2023, 8, 12),
    schedule_interval='@daily'
) as dag:

    preprocess = DummyOperator(task_id='preprocess_data')

    mark_for_downstream = ExternalTaskMarker(
        task_id='mark_downstream_dependency',
        external_dag_id='downstream_dag',
        external_task_id='wait_for_upstream'
    )

    preprocess >> mark_for_downstream

의미:

“내가 downstream_dag의 wait_for_upstream 태스크와 연결되어 있다.”

즉, 다운스트림 DAG이 이 태스크가 끝날 때까지 기다려야 한다는 관계 정보를 Airflow 메타데이터에 기록합니다.

 

✅ 2. downstream_dag.py

from airflow import DAG
from airflow.sensors.external_task import ExternalTaskSensor
from airflow.operators.dummy import DummyOperator
from datetime import datetime

with DAG(
    dag_id='downstream_dag',
    start_date=datetime(2023, 8, 12),
    schedule_interval='@daily'
) as dag:

    wait_for_upstream = ExternalTaskSensor(
        task_id='wait_for_upstream',
        external_dag_id='upstream_dag',
        external_task_id='mark_downstream_dependency',
        allowed_states=['success'],
        failed_states=['failed', 'skipped'],
        poke_interval=60
    )

    model_train = DummyOperator(task_id='train_model')

    wait_for_upstream >> model_train

의미:

downstream_dag은 upstream_dag의 mark_downstream_dependency 태스크가

성공할 때까지 기다렸다가 실행한다.

 

 

2. DAG 간 동작 흐름

┌──────────────────────────────┐
│         upstream_dag         │
│   └── mark_downstream_dependency (Marker)
│            │
│            ▼
│  메타데이터에 관계 기록
└────────────┬─────────────────┘
             │
             ▼
┌──────────────────────────────┐
│        downstream_dag         │
│   └── wait_for_upstream (Sensor)
│            │
│            ▼
│        train_model 실행
└──────────────────────────────┘

 

 

3. 사용 이유

일반적인 ExternalTaskSensor만 써도 DAG 간 순서 제어는 가능합니다.
하지만 ExternalTaskMarker를 추가하면 다음과 같은 장점이 있어요 👇

장점 설명
명시적 DAG 관계 표시 Airflow UI에서 DAG 간 연결을 시각적으로 표현
데이터 계보(Dependency Graph) DAG 간 종속 관계를 쉽게 파악 가능
정리된 의존성 관리 어떤 DAG이 어떤 DAG에 의존하는지 명확히 표시
대규모 DAG 시스템에 적합 여러 DAG 간 복잡한 의존성 관리 가능

 

 

정리하면

 

ExternalTaskMarker는 Airflow의 DAG 간 관계를 명시적으로 표시하는 마커다.
ExternalTaskSensor와 함께 사용하면 DAG 간 실행 순서를
Airflow 메타데이터 수준에서 안전하고 시각적으로 관리할 수 있다.