1. Apache Airflow란?
Apache Airflow는 워크플로우 오케스트레이션 플랫폼으로, 복잡한 데이터 파이프라인의 스케줄링, 모니터링, 관리를 위한 오픈소스 도구입니다. Python으로 작성된 DAG(Directed Acyclic Graph)를 통해 워크플로우를 코드로 정의합니다.
📝 코드로서의 워크플로우
Python 스크립트로 파이프라인을 정의하여 버전 관리, 테스트, 협업이 용이합니다.
⏱️ 동적 스케줄링
크론 표현식보다 유연한 스케줄링과 의존성 관리로 복잡한 실행 순서를 제어합니다.
🔌 확장성
다양한 Operator, Hook, Executor를 통해 클라우드 서비스, 데이터베이스, 도구와 연동합니다.
2. 왜 써야 하는가?
기존 배치 스케줄러와 비교한 Airflow의 장점:
| 도구 | 장점 | 단점 | Airflow 비교 |
|---|---|---|---|
| Cron | 간단함, 유니버설 | 의존성 관리 어려움, 모니터링 부족 | ✅ 의존성, 재시도, 모니터링 내장 |
| Luigi | Python 기반, Spotify 개발 | 스케줄링 기능 제한, 웹 UI 부족 | ✅ 풍부한 UI, 강력한 스케줄러 |
| 기존 ETL 툴 | GUI, 비개발자 접근성 | Lock-in, 확장성 제한, 비용 | ✅ 오픈소스, 코드 기반, 확장성 |
| 직접 개발 | 완전한 제어 | 유지보수 부담, 재발명 | ✅ 검증된 플랫폼, 커뮤니티 |
💡 적합한 사용 사례
Airflow는 정기적 배치 작업, 데이터 파이프라인, ML 모델 재학습, 리포트 생성, 데이터 품질 체크에 특히 효과적입니다. 실시간 스트리밍에는 적합하지 않습니다.
3. 핵심 개념
아키텍처 개요
주요 컴포넌트
- DAG (Directed Acyclic Graph): 태스크와 의존성을 정의하는 워크플로우
- Operator: 실제 작업을 수행하는 단위 (PythonOperator, BashOperator 등)
- Task: Operator의 인스턴스
- TaskInstance: 특정 실행 시점의 Task 상태
- Hook: 외부 시스템 연결 인터페이스
- Connection: 외부 시스템 접속 정보
- Variable: 전역 변수 저장소
- XCom: 태스크 간 데이터 교환
4. 퀵스타트
1단계: 설치
# pip를 통한 설치 (추천)
pip install apache-airflow==2.7.0
# 제약 조건 파일 사용 (선택적)
pip install apache-airflow==2.7.0 \
--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.0/constraints-3.9.txt"
2단계: 초기화 및 설정
# 환경 변수 설정 (선택적, 기본값 사용 가능)
export AIRFLOW_HOME=~/airflow
# 데이터베이스 초기화
airflow db init
# 관리자 계정 생성
airflow users create \
--username admin \
--firstname Admin \
--lastname User \
--role Admin \
--email admin@example.com \
--password admin123
3단계: 첫 DAG 작성
# ~/airflow/dags/first_dag.py
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.operators.bash import BashOperator
def print_hello():
print("Hello from Airflow!")
return "Hello World"
default_args = {
'owner': 'data_engineer',
'depends_on_past': False,
'email_on_failure': True,
'email': ['alerts@example.com'],
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
with DAG(
dag_id='first_dag',
default_args=default_args,
description='첫 번째 Airflow DAG',
schedule_interval='0 9 * * *', # 매일 오전 9시
start_date=datetime(2026, 3, 1),
catchup=False,
tags=['tutorial', 'example'],
) as dag:
task1 = BashOperator(
task_id='print_date',
bash_command='date',
)
task2 = PythonOperator(
task_id='print_hello',
python_callable=print_hello,
)
task3 = BashOperator(
task_id='sleep',
bash_command='sleep 5',
retries=3,
)
task1 >> task2 >> task3 # 의존성 정의
4단계: 서비스 실행
# 웹 서버 실행 (포트 8080)
airflow webserver --port 8080
# 새 터미널에서 스케줄러 실행
airflow scheduler
# 브라우저에서 http://localhost:8080 접속
# admin/admin123 로그인
⚠️ 주의사항
운영 환경에서는 SQLite 대신 PostgreSQL/MySQL을 사용하고, 보안 설정(SSL, 강력한 비밀번호)을 적용해야 합니다. 개발 환경에서만 기본 설정을 사용하세요.
5. 핵심 설정 레퍼런스
| 설정 | 기본값 | 설명 | 권장값 |
|---|---|---|---|
| executor | SequentialExecutor | 태스크 실행 방식 | CeleryExecutor (운영) |
| sql_alchemy_conn | sqlite:////.../airflow.db | 메타데이터 DB 연결 | postgresql://user:pass@host/db |
| parallelism | 32 | 전체 동시 실행 태스크 수 | CPU 코어 × 2 ~ 4 |
| dag_concurrency | 16 | DAG별 동시 태스크 수 | 8 ~ 16 |
| max_active_runs_per_dag | 16 | DAG별 동시 실행 수 | 3 ~ 5 |
| fernet_key | 생성됨 | 암호화 키 (변수, 연결 정보) | 자체 생성 키 사용 |
| load_examples | True | 예제 DAG 로드 여부 | False (운영) |
🔧 설정 파일 위치
주 설정 파일은 ~/airflow/airflow.cfg에 위치합니다. 환경 변수로도 오버라이드 가능: AIRFLOW__CORE__SQL_ALCHEMY_CONN
6. 실무 팁 & 트러블슈팅
자주 겪는 문제
문제: DAG가 UI에 안 보임
원인: 파싱 에러, import 오류, 스케줄러 정지
해결: airflow dags list 확인, 로그에서 에러 검색, DAG 파일 문법 검증
문제: 태스크가 "큐잉" 상태에서 멈춤
원인: Executor 문제, Worker 부족, 리소스 제한
해결: Executor 상태 확인, Worker 증설, pool 설정 검토
문제: 느린 DAG 파싱
원인: 무거운 import, 복잡한 상단 코드
해결: DAG 정의 상단을 가볍게 유지, lazy import 활용
실무 팁
- DAG 파일 최적화: 상단에 무거운 라이브러리 import 금지, 함수 내부에서 import
- 의존성 관리:
task1 >> [task2, task3] >> task4형태로 간결하게 표현 - 에러 처리:
retries,retry_delay,on_failure_callback활용 - 변수 관리: Connection과 Variable은 UI/API로 관리, 코드에 하드코딩 금지
- 테스트:
airflow tasks test dag_id task_id execution_date로 단위 테스트 - 모니터링: 메트릭스(StatsD) 연동, 알림(Slack/Email) 설정 필수
🚀 성능 최적화
1. dagbag_import_timeout 증가 (기본 30초)
2. scheduler_heartbeat_sec 조정 (기본 5초)
3. PostgreSQL 사용 시 적절한 인덱스 생성
4. Pools로 리소스 제한 태스크 그룹화
7. 참고 자료
- 📖 공식 문서 (Apache Airflow) - 가장 최신의 정확한 정보
- 🐙 GitHub 저장소 - 소스코드, 이슈, 컨트리뷰션
- 👥 커뮤니티 - Slack, 메일링리스트, 행사
- 🛠️ Astronomer 가이드 - 실무 Best Practices
- 🎤 Airflow Summit - 컨퍼런스 발표 자료
- ✍️ 블로그 포스트 - 사용자 경험 공유
📚 학습 경로 추천
1. 공식 튜토리얼 완료 → 2. 로컬 개발 환경 구축 → 3. 간단한 DAG 작성 → 4. 커스텀 Operator/Hook 개발 → 5. 운영 환경 배포 → 6. 모니터링/알림 설정