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 우선순위:

  1. Task 개별 retries 파라미터
  2. DAG default_argsretries
  3. 환경변수 AIRFLOW__CORE__DEFAULT_TASK_RETRIES

관련 개념

소스