Airflow를 실행하다 보면,
작업(Task)마다 성격이 다르다는 걸 느끼게 됩니다.
어떤 건 CPU를 많이 쓰고, 어떤 건 파일 입출력이나 네트워크 작업이 많죠.
이때 모든 Task를 한 워커에서 처리하면?
CPU가 바쁜 작업 하나 때문에 다른 작업들이 밀리거나,
리소스 낭비가 생길 수 있습니다.
그래서 Celery Queue 를 이용해
작업 종류별로 워커를 분리할 수 있습니다
비유로 이해하기
레스토랑 주방을 생각해볼게요 👇
- 🍳 CPU-intensive 작업 → 고기 굽는 셰프 (화력 많이 필요)
- 🧊 I/O-intensive 작업 → 음료나 디저트 담당 (기다림 많음)
모든 주문을 한 셰프가 다 처리하면 비효율적이겠죠?
그래서 주방을 나눠서 각 셰프가 자신의 전공 요리만 맡게 합니다.
Airflow의 Worker도 마찬가지예요.
실제 설정 방법
1️⃣ docker-compose.yml 에서 Worker 정의
airflow-worker-cpu:
<<: *airflow-common
command: celery worker -q cpu_intensive
restart: always
airflow-worker-io:
<<: *airflow-common
command: celery worker -q io_intensive
restart: always
- -q cpu_intensive → CPU 계산이 많은 작업만 처리
- -q io_intensive → 입출력이 많은 작업만 처리
이렇게 하면 두 개의 워커가 서로 다른 큐를 감시하게 됩니다.
2️⃣ DAG 내 Task에 Queue 지정
task_train_model = BashOperator(
task_id="train_model",
queue="cpu_intensive",
bash_command="python train.py"
)
task_export_data = BashOperator(
task_id="export_data",
queue="io_intensive",
bash_command="python export.py"
)
Task에 queue 옵션을 주면,
스케줄러는 해당 작업을 지정한 큐에 넣고,
그 큐를 바라보는 워커가 처리하게 됩니다.
전체 흐름 요약
[Scheduler]
↓
(Task 분류)
↓
[Redis Queue]
├── cpu_intensive → airflow-worker-cpu
└── io_intensive → airflow-worker-io
각 워커가 자신에게 맞는 큐만 바라보기 때문에
서로 간섭 없이 효율적으로 동작합니다
정리하면
Airflow에서는 작업의 성격에 따라 큐를 나누고,
각 큐를 담당하는 워커를 따로 두면
리소스를 훨씬 효율적으로 사용할 수 있다.
'컨테이너·워크플로우 자동화 > Airflow로 워크플로우 자동화하기' 카테고리의 다른 글
| Airflow Edge Label — 그래프 관계를 더 명확하게 표시하기 (0) | 2025.10.19 |
|---|---|
| Airflow TaskGroup — 복잡한 DAG을 깔끔하게 묶는 방법 (0) | 2025.10.19 |
| Airflow Queue란? (0) | 2025.10.19 |
| Airflow Dataset 완전 정리 (1) | 2025.10.19 |
| Airflow의 Backfill & Catchup 이해하기 (0) | 2025.10.19 |