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

Airflow Worker별 Queue 설정하기

Data Jun 2025. 10. 19. 17:03

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에서는 작업의 성격에 따라 큐를 나누고,
각 큐를 담당하는 워커를 따로 두면
리소스를 훨씬 효율적으로 사용할 수 있다.