Airflow에서 BranchOperator를 사용하면, 의도와 다르게 마지막 Task(end_task)가 Skipped 되는 상황을 자주 만나게 됩니다.
이 문제의 원인은 대부분 trigger_rule의 기본값을 그대로 사용했기 때문입니다
.
BranchOperator는 조건에 맞는 경로 하나만 실행하고, 나머지 경로는 의도적으로 Skipped 처리합니다.
문제는 그 다음입니다.
1. 문제의 원인: trigger_rule 기본값
Airflow의 모든 Task는 기본적으로 trigger_rule="all_success"를 사용합니다.
이 규칙은 모든 upstream task가 Success일 때만 실행됩니다.
2, Branch 이후 merge 지점에서 발생하는 현상
즉, 분기 구조가 다음과 같다면:
branch
├─ branch_a (Success)
└─ branch_b (Skipped)
↓
end_task
end_task의 관점에서는
upstream 중 하나가 Skipped이므로 조건 불만족 → end_task도 Skipped 됩니다.
이 동작은 버그가 아니라, Airflow가 규칙대로 정확히 실행한 결과입니다.
3. 해결 방법: merge 지점에 맞는 trigger_rule
이럴 때 필요한 것이 merge 지점용 trigger_rule 설정입니다.
대표적으로 가장 많이 쓰이는 규칙은 none_failed입니다.
end_task = BashOperator(
task_id="end_task",
bash_command="echo end",
trigger_rule="none_failed",
)
이 규칙은 실패(Failed)만 없으면 실행되므로,
BranchOperator로 인해 발생한 Skipped는 정상 흐름으로 허용합니다.
비유하자면,
all_success는 “모두 참석해야 회의 시작” 이고,
none_failed는 “결석은 괜찮고 사고만 없으면 시작” 입니다.
Branch 이후 합류 지점에서는
전자를 쓰면 멈추고, 후자를 써야 흐름이 이어집니다.
4. 정리하면
BranchOperator 뒤에서 Task가 Skipped 된다면 버그가 아니라 trigger_rule=all_success 때문이며, merge 지점에는 none_failed 같은 규칙을 명시해야 합니다.
'컨테이너·워크플로우 자동화 > Airflow로 워크플로우 자동화하기' 카테고리의 다른 글
| [트러블 슈팅] Airflow + PostgreSQL에서 KST 시간이 UTC처럼 저장되던 문제 (0) | 2026.01.23 |
|---|---|
| [트러블슈팅] Airflow에서 pipeline 패키지 인식하지 못했던 이유와 해결 과정 (0) | 2026.01.23 |
| [트러블슈팅] Airflow FileSensor 실행 실패: fs_default Connection이 없을 때 (0) | 2026.01.21 |
| [트러블슈팅] Docker Compose로 Airflow가 안 뜰 때: health: starting 무한 루프와 PermissionError (0) | 2026.01.21 |
| Airflow 세계관의 출발점 (Airflow Component) (0) | 2026.01.21 |