DAG 멱등성 (Idempotency)
동일한 입력으로 DAG Run을 몇 번 반복 실행해도 항상 동일한 결과가 나오는 성질. Airflow 파이프라인 설계의 핵심 원칙이자 안정적인 Retry·장애복구의 전제 조건이다.
설명
멱등성(Idempotency)은 분산 시스템에서 재실행 안전성을 보장하는 특성이다. apache-airflow에서 DAG가 멱등성을 갖추면:
- 동일
execution_date로 DAG를 재실행해도 데이터 중복·손실이 없다 - 장애 후 특정 구간만 선택적으로 재실행(backfill)할 수 있다
- Retry가 안전하게 작동한다 — 부분 성공 후 재시도해도 이미 처리된 레코드가 중복 삽입되지 않는다
멱등성이 없는 DAG는 재실행 시 데이터 중복, 잘못된 집계, 예측 불가한 부작용을 유발한다.
멱등성 확보 방법
태스크 원자화
각 태스크는 하나의 작업만 담당하고 독립 재실행이 가능해야 한다. ETL 파이프라인을 예로 들면:
Extract Task → Transform Task → Load Task
세 태스크로 분리하면 Transform 실패 시 Extract를 다시 실행할 필요 없이 Transform만 재시도한다.
Jinja 템플릿 사용
datetime.today() 같은 현재 시각 기반 코드는 실행 시점에 따라 결과가 달라져 멱등성을 깨뜨린다.
# 나쁜 예 — 재실행 시점에 따라 결과가 달라짐
yesterday = datetime.today() - timedelta(1)
# 좋은 예 — execution_date 기준으로 고정
yesterday = {{ prev_start_date_success }}Airflow 내장 매크로와 Jinja 템플릿은 DAG Run의 execution_date를 기준으로 동작하여 멱등성을 보장한다.
증분 처리 (Incremental Filtering)
전체 데이터셋을 매번 재처리하는 대신 DAG 실행 구간(hour/day)의 레코드만 처리한다.
- last_modified_date 기반: 소스 레코드에 수정 시각 컬럼이 있을 때 권장. DAG Run의 실행 구간에 해당하는 레코드만 추출.
- sequence_id 기반: 수정 시각이 없고 레코드가 append-only일 때 사용. 이전 Run의 마지막 ID 이후 레코드만 처리.
Retry와의 관계
retries=2를 설정하면 분산 환경에서 발생하는 zombie process, 일시적 네트워크 오류 대부분을 커버한다. 멱등성이 확보된 태스크에서만 Retry가 안전하다 — 멱등성 없이 Retry하면 중복 실행으로 데이터가 오염된다.
Retry 우선순위:
- Task 개별
retries파라미터 - DAG
default_args의retries - 환경변수
AIRFLOW__CORE__DEFAULT_TASK_RETRIES
관련 개념
- airflow-dag-design-patterns — 멱등성을 실현하는 설계 패턴들