핵심 인사이트 (3줄 요약)

  1. 본질: Apache Airflow는 파이썬 코드로 워크플로우를 DAG (Directed Acyclic Graph, 방향성 비순환 그래프)로 정의하고, 스케줄러가 이를 자동 실행·모니터링하는 오픈소스 오케스트레이션 플랫폼이다.
  2. 가치: 복잡한 데이터 파이프라인의 의존성 관리, 실패 재시도, 시각적 모니터링을 코드로 표현(Configuration as Code)하여 유지보수성과 가시성을 동시에 높인다.
  3. 판단 포인트: Airflow는 배치 파이프라인 스케줄링에 강력하지만 실시간 스트리밍과는 맞지 않으며, 스케일아웃 시 CeleryExecutor 또는 KubernetesExecutor로 전환해야 하는 아키텍처 결정이 필요하다.

Ⅰ. 개요 및 필요성

1.1 Apache Airflow란?

Apache Airflow는 Airbnb가 2014년에 개발하고 2019년 Apache Top Level Project가 된 파이썬 기반 워크플로우 오케스트레이션 플랫폼이다. 데이터 파이프라인의 작업 의존성을 DAG (Directed Acyclic Graph, 방향성 비순환 그래프)로 표현하고 스케줄에 따라 자동 실행한다.

Airflow 없는 세상 (문제 상황)
┌────────────────────────────────────────────────────────┐
│  스크립트 A (00:00 실행)                                │
│  스크립트 B (01:00 실행)  ← A 완료 확인을 어떻게?      │
│  스크립트 C (02:00 실행)  ← B 실패 시 C는?             │
│  → 크론탭(crontab)으로 시간 기반 실행                  │
│  → 의존성 관리 없음, 실패 재시도 없음                  │
│  → 파이프라인 현황 가시성 없음                          │
└────────────────────────────────────────────────────────┘

Airflow 도입 후
┌────────────────────────────────────────────────────────┐
│  DAG: etl_pipeline                                     │
│  extract_task → transform_task → load_task             │
│                    ↓ (실패 시)                          │
│                 자동 재시도 3회                         │
│                 → 알람 발송                            │
│  Web UI로 실시간 현황 모니터링                          │
└────────────────────────────────────────────────────────┘

1.2 DAG (Directed Acyclic Graph) 개념

DAG = 방향성(Directed) + 비순환(Acyclic) + 그래프(Graph)

방향성: 작업 A → 작업 B (A가 끝나야 B 시작)
비순환: A → B → C → A 같은 순환 불가 (무한 루프 방지)

예시 DAG:
extract_data
     │
     ├──→ validate_data ──→ load_to_staging
     │                              │
     └──→ profile_data             │
                                   ▼
                           run_dbt_models
                                   │
                           ┌───────┴────────┐
                           ▼               ▼
                    build_marts      send_report

📢 섹션 요약 비유: Airflow는 복잡한 요리 레시피를 자동으로 실행하는 주방 AI와 같다. "재료 손질(extract) → 조리(transform) → 담기(load)" 순서를 코드로 적어두면, AI가 알아서 순서대로 실행하고, 중간에 실패하면 다시 시도하며, 모든 과정을 화면으로 보여준다.


Ⅱ. 아키텍처 및 핵심 원리

2.1 Airflow 핵심 구성요소

┌──────────────────────────────────────────────────────────────────┐
│                     Apache Airflow 아키텍처                      │
├────────────────┬─────────────────────────────────────────────────┤
│  Web Server    │  Django 기반 Web UI                              │
│  (Flask)       │  DAG 시각화, 실행 현황, 로그 확인                │
├────────────────┼─────────────────────────────────────────────────┤
│  Scheduler     │  DAG 파일 파싱, 트리거 결정                      │
│                │  스케줄 기반 또는 외부 트리거로 DagRun 생성      │
├────────────────┼─────────────────────────────────────────────────┤
│  Executor      │  실제 작업 실행 담당                              │
│                │  Sequential/Local/Celery/Kubernetes              │
├────────────────┼─────────────────────────────────────────────────┤
│  Workers       │  Executor에서 할당받은 Task 실행                  │
│                │  Celery: Celery Worker                          │
│                │  K8s: Pod로 Task 실행                           │
├────────────────┼─────────────────────────────────────────────────┤
│  Metadata DB   │  DAG 메타데이터, 실행 이력                       │
│  (PostgreSQL)  │  변수(Variables), 연결(Connections)              │
├────────────────┼─────────────────────────────────────────────────┤
│  DAG 파일      │  Python 파일로 정의된 워크플로우                  │
│  (File System) │  Scheduler가 주기적으로 파싱                     │
└────────────────┴─────────────────────────────────────────────────┘

2.2 Airflow DAG 코드 예시

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.operators.bash import BashOperator
from airflow.providers.google.cloud.operators.bigquery import BigQueryInsertJobOperator
from datetime import datetime, timedelta

# DAG 기본 설정
default_args = {
    'owner': 'data-team',
    'depends_on_past': False,
    'email': ['alert@company.com'],
    'email_on_failure': True,
    'email_on_retry': False,
    'retries': 3,                           # 실패 시 3회 재시도
    'retry_delay': timedelta(minutes=5),    # 재시도 간격 5분
}

with DAG(
    dag_id='ml_training_pipeline',
    default_args=default_args,
    description='ML 학습 파이프라인',
    schedule_interval='0 2 * * *',  # 매일 새벽 2시 실행 (cron 표현식)
    start_date=datetime(2024, 1, 1),
    catchup=False,  # 과거 실행 누락 복구 안 함
    tags=['ml', 'training'],
) as dag:

    # 단계 1: 데이터 추출
    extract_task = BashOperator(
        task_id='extract_data',
        bash_command='python /opt/scripts/extract.py --date {{ ds }}',
    )

    # 단계 2: 데이터 검증
    def validate_data(**context):
        execution_date = context['ds']
        # 검증 로직...
        print(f"{execution_date} 데이터 검증 완료")

    validate_task = PythonOperator(
        task_id='validate_data',
        python_callable=validate_data,
    )

    # 단계 3: BigQuery 변환
    transform_task = BigQueryInsertJobOperator(
        task_id='transform_data',
        configuration={
            "query": {
                "query": "{% raw %}{% include 'sql/transform.sql' %}{% endraw %}",
                "useLegacySql": False,
            }
        },
    )

    # 단계 4: 모델 학습
    train_task = BashOperator(
        task_id='train_model',
        bash_command='python /opt/scripts/train.py --date {{ ds }}',
    )

    # 의존성 설정 (오른쪽 화살표 = 실행 순서)
    extract_task >> validate_task >> transform_task >> train_task

2.3 Operator 종류

Operator설명사용 예시
BashOperator셸 명령어 실행스크립트 실행, 파일 이동
PythonOperatorPython 함수 실행데이터 처리, API 호출
SparkSubmitOperatorSpark 잡 제출대용량 배치 처리
BigQueryOperatorBigQuery SQL 실행데이터 변환, 집계
S3ToRedshiftOperatorS3 → Redshift 복사데이터 로딩
KubernetesPodOperatorK8s Pod 실행컨테이너 기반 작업
DummyOperator빈 작업 (분기 포인트)DAG 구조화
BranchPythonOperator조건부 분기A/B 실행 경로 선택

2.4 Executor 비교

┌───────────────────────────────────────────────────────────────┐
│                     Executor 비교                              │
├──────────────────┬──────────────┬────────────────────────────┤
│ SequentialExecutor│ 단일 프로세스│ 개발/테스트용, 병렬 불가  │
├──────────────────┼──────────────┼────────────────────────────┤
│ LocalExecutor     │ 로컬 멀티프로│ 소규모 운영, 단일 서버    │
│                   │ 세스 (fork) │ (수십 개 태스크 동시)     │
├──────────────────┼──────────────┼────────────────────────────┤
│ CeleryExecutor    │ 분산 워커    │ 중~대규모, 고가용성       │
│                   │ (RabbitMQ/  │ 워커 수평 확장 가능       │
│                   │  Redis)     │ 복잡한 설정 필요          │
├──────────────────┼──────────────┼────────────────────────────┤
│ KubernetesExecutor│ 태스크별    │ 클라우드 네이티브         │
│                   │ K8s Pod 생성│ 자원 격리, 동적 스케일링  │
│                   │             │ 태스크 시작 오버헤드 있음 │
└──────────────────┴──────────────┴────────────────────────────┘

📢 섹션 요약 비유: Airflow Executor는 배달 시스템과 같다. SequentialExecutor는 혼자 한 명씩 배달(순차), LocalExecutor는 같은 빌딩의 여러 배달원(로컬 병렬), CeleryExecutor는 여러 지점의 배달원들(분산), KubernetesExecutor는 주문마다 드론을 새로 보내는 방식(Pod 생성)이다.


Ⅲ. 비교 및 연결

3.1 Airflow vs Luigi vs Prefect vs Dagster

항목AirflowLuigiPrefectDagster
개발사Apache/AirbnbSpotifyPrefect TechnologiesElementl
정의 방식Python DAGPython TaskPython FlowPython Asset/Job
동적 DAG제한적없음완전 지원완전 지원
관찰성기본 UI기본 UI강력한 UI매우 강력한 UI
데이터 자산없음없음제한적핵심 개념
클라우드 서비스MWAA, Composer없음Prefect CloudDagster Cloud
활성 커뮤니티매우 높음낮음높음높음
러닝 커브중간쉬움쉬움중간

3.2 Airflow의 한계와 대안

한계설명대안
실시간 스트리밍 불가배치 지향 설계Apache Flink, Kafka Streams
동적 태스크 제한DAG 구조 런타임 변경 어려움Prefect, Dagster
스케줄러 단일 장애점스케줄러 다운 시 전체 중단Airflow 2.x HA 스케줄러
무거운 설치Celery + Redis 설정 복잡MWAA, Cloud Composer 관리형
의존성 표현 한계크로스-DAG 의존성 어려움외부 센서 + 이벤트

3.3 Airflow 관리형 서비스

서비스제공사특징
Amazon MWAAAWSEKS 기반, IAM 통합
Cloud ComposerGCPGKE 기반, GCP 서비스 완전 통합
AstronomerAstronomer전문 Airflow 관리형 SaaS

📢 섹션 요약 비유: Airflow vs Prefect/Dagster는 전통 지도(Airflow)와 내비게이션 앱(Prefect/Dagster)의 차이다. 전통 지도는 넓은 생태계와 검증된 신뢰성이 있지만, 내비게이션은 실시간 경로 변경(동적 DAG)과 더 나은 UX를 제공한다.


Ⅳ. 실무 적용 및 기술사 판단

4.1 Airflow 모범 사례

┌──────────────────────────────────────────────────────────────┐
│                  Airflow 모범 사례 (Best Practices)          │
├──────────────────────────────────────────────────────────────┤
│  DAG 설계                                                    │
│  □ 한 DAG당 하나의 논리적 워크플로우만                       │
│  □ 태스크를 원자적(Atomic)으로 설계 (재시도 안전)            │
│  □ 비즈니스 로직은 DAG 외부 (Python 모듈)에 위치             │
│  □ XCom은 소량 데이터만 (대용량은 S3/GCS 경유)              │
├──────────────────────────────────────────────────────────────┤
│  성능                                                        │
│  □ schedule_interval 최소 5분 이상 (너무 잦은 실행 금지)     │
│  □ max_active_runs로 동시 실행 제한                          │
│  □ 연결 풀링 (Connections Pool) 활용                         │
├──────────────────────────────────────────────────────────────┤
│  운영                                                        │
│  □ Variables/Connections에 민감 정보 저장 (하드코딩 금지)    │
│  □ SLA (Service Level Agreement) 설정으로 지연 알람          │
│  □ 로그 외부화 (S3/GCS)로 장기 보관                         │
└──────────────────────────────────────────────────────────────┘

4.2 기술사 시험 핵심 포인트

Q. Apache Airflow와 Luigi, Prefect를 비교하고 각각의 적합 사용 사례를 설명하시오.

  • Airflow: 복잡한 의존성의 대규모 배치 파이프라인, 풍부한 Operator 생태계, 안정성이 검증된 운영 환경에 적합
  • Luigi: 간단한 파이프라인, 소규모 팀에서 빠른 도입이 필요할 때 적합
  • Prefect: 동적 워크플로우(런타임 DAG 변경), 마이크로서비스 아키텍처, 데이터 품질 검증에 적합
  • Dagster: 데이터 자산(Asset) 중심 파이프라인, 데이터 품질 가시성, ML 파이프라인에 적합

Q. Airflow KubernetesExecutor의 동작 원리와 장단점을 설명하시오.

KubernetesExecutor는 각 Airflow Task를 독립된 쿠버네티스 Pod로 실행한다. Scheduler가 Task를 대기 큐에서 꺼내면, K8s API를 통해 Pod를 생성하고 Task를 실행한다. Task 완료 후 Pod는 자동 삭제된다.

  • 장점: 완전한 자원 격리, 동적 스케일링, Task별 다른 Docker 이미지 사용 가능
  • 단점: Pod 생성 오버헤드(수십 초), 단발성 Task가 많으면 오버헤드 누적, K8s 운영 지식 필요

4.3 실무 배포 구조 (엔터프라이즈)

┌──────────────────────────────────────────────────────────────┐
│              엔터프라이즈 Airflow 배포 구조                   │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  Git (DAG 코드 관리)                                         │
│       │ CI/CD                                                │
│       ▼                                                      │
│  DAG 파일 서버 (NFS/S3)                                      │
│       │ 마운트                                               │
│       ▼                                                      │
│  Airflow Web Server ←── 운영자 모니터링                      │
│  Airflow Scheduler                                           │
│       │ 태스크 할당                                          │
│       ▼                                                      │
│  ┌─────────────────────────────────────────┐               │
│  │  Celery Workers (Auto Scaling Group)    │               │
│  │  Worker 1  Worker 2  ...  Worker N      │               │
│  └─────────────────────────────────────────┘               │
│       │                                                      │
│       ▼                                                      │
│  외부 시스템: BigQuery, Spark, S3, Redis, ML 서버            │
│                                                              │
│  메타데이터: Aurora PostgreSQL (Multi-AZ)                    │
│  브로커: Redis ElastiCache                                   │
└──────────────────────────────────────────────────────────────┘

📢 섹션 요약 비유: 엔터프라이즈 Airflow는 항공사 운항 관리 시스템과 같다. 스케줄러는 관제탑, 워커는 비행기 조종사, Web UI는 항공편 현황판이다. CeleryExecutor는 여러 활주로에서 동시에 비행기를 이륙시키고, KubernetesExecutor는 비행마다 새 조종석을 만들어 격리 운항하는 방식이다.


Ⅴ. 기대효과 및 결론

5.1 Airflow 도입 기대효과

항목크론탭 기반Airflow 기반개선
의존성 관리없음 (시간 기반만)DAG로 명확한 관계 표현파이프라인 신뢰성 향상
실패 처리수동 확인 후 재실행자동 재시도 + 알람운영 공수 80% 감소
가시성없음Web UI 실시간 모니터링이슈 감지 속도 향상
코드 관리분산된 쉘 스크립트Git 기반 버전 관리코드 품질 향상
확장성서버 증설CeleryExecutor 워커 추가수평 확장 가능

5.2 결론

Apache Airflow는 데이터 엔지니어링과 MLOps 분야에서 사실상 표준(De Facto Standard) 워크플로우 오케스트레이션 도구다. DAG 기반 의존성 관리, 풍부한 Operator 생태계, 시각적 모니터링은 복잡한 데이터 파이프라인 운영을 코드로 관리할 수 있게 한다. 실시간 스트리밍이 아닌 배치 파이프라인에서 검증된 선택이다.

📢 섹션 요약 비유: Apache Airflow는 복잡한 공사 현장의 공정 관리 시스템과 같다. 기초 공사 → 골조 → 배관 → 마감 순서의 의존성을 DAG로 표현하고, 어느 한 공정이 지연되거나 실패하면 즉시 감리자(운영자)에게 알람을 보내며, 현장 전체 진행 상황을 실시간으로 한눈에 볼 수 있다.


📌 관련 개념 맵

관계개념설명
핵심 개념DAG (Directed Acyclic Graph)작업 의존성 표현 그래프
핵심 구성SchedulerDAG 파싱 및 실행 트리거
핵심 구성Executor태스크 실행 방식 결정
핵심 구성Operator개별 태스크 실행 단위
비교 도구Luigi (Spotify)범용 파이프라인 (경쟁)
비교 도구Prefect동적 워크플로우 (경쟁)
비교 도구Dagster데이터 자산 중심 (경쟁)
연관Kubeflow PipelinesML 특화 파이프라인 (협력/경쟁)
상위 개념MLOpsAirflow는 CT 파이프라인 스케줄링에 활용
클라우드Amazon MWAAAWS 관리형 Airflow
클라우드Cloud ComposerGCP 관리형 Airflow

👶 어린이를 위한 3줄 비유 설명

  1. Airflow는 자동 청소 로봇의 청소 순서 프로그램 같아요. "방 청소 → 화장실 청소 → 쓰레기 버리기" 순서를 코드로 적어두면, 매일 새벽에 자동으로 청소를 실행하고 중간에 실패하면 다시 시도해요.
  2. DAG는 레고 설명서 같아요. 어느 부품을 먼저 조립해야 다음 부품을 붙일 수 있는지 순서도로 그려두면, 로봇이 알아서 순서대로 조립해요.
  3. Executor는 음식 배달 방법 같아요. 혼자 다 배달하거나(Sequential), 여러 명이 나눠서 하거나(Celery), 각 주문마다 드론을 보내는(Kubernetes) 방법 중 상황에 맞게 골라요.

📈 관련 키워드 및 발전 흐름도

cron + 쉘 스크립트 (원시적 스케줄링)
    │
    ▼
Apache Airflow: Python DAG 기반 워크플로우
    ├─► Scheduler: DAG 실행 스케줄링
    ├─► Executor: Sequential · Celery · Kubernetes
    └─► Web UI: 실행 현황 · 로그 · 재시도 관리
    │
    ▼
Airflow + Kubernetes Executor → 동적 Pod 스케일링
    │
    ▼
차세대 오케스트레이터
    ├─► Dagster: 자산 기반 (Asset-centric)
    ├─► Prefect: Pythonic, 클라우드 네이티브
    └─► Mage AI: 통합 데이터 파이프라인