콘텐츠로 이동

Airflow 스케줄링

개요

파이프라인이 코드로 짜여 있어도, "언제 돌릴까"를 정하지 않으면 자동화가 아니에요. Airflow는 DAG에 schedule을 달아서 정해진 주기마다 자동으로 작업을 띄워요. cron이 단순 시간 실행이라면, Airflow 스케줄링은 그 위에 "어느 시점, 어떤 데이터를 다룰지"를 함께 계산한다는 게 핵심이에요. 이 페이지는 공식 문서 기준으로 schedule 인자와 데이터 구간, 백필·캐치업 개념을 풀어요.

핵심 개념

schedule 인자

DAG는 실행 주기를 schedule로 정의해요. 아무 것도 주지 않으면 스케줄 없이 수동/API로만 실행되고, 값을 주면 정해진 시각에 자동 실행돼요.

with DAG("my_daily_dag", schedule="0 0 * * *"):   # 매일 자정 (cron)
    ...
with DAG("my_one_time_dag", schedule="@once"):     # 한 번만
    ...
with DAG("my_continuous_dag", schedule="@continuous"):  # 지속 실행
    ...

cron 표현(0 0 * * *)으로 세밀하게, 프리셋(@daily, @weekly, @once, @continuous 등)으로 간편하게 지정할 수 있어요.

Dag Run과 데이터 구간(Data Interval)

DAG가 스케줄로 실행될 때마다 Dag Run 인스턴스가 생겨요. 각 Dag Run은 data interval(데이터 구간) 을 가져요 — 이 실행이 다루어야 할 데이터의 기간을 뜻하죠. 모든 작업·오퍼레이터·센서가 이 구간을 기준으로 동작해요.

여기서 logical date(논리적 날짜, 예전 이름 execution date) 가 등장해요. 이건 실제 시작 시각이 아니라 "이 Dag Run이 의도된 시점"이에요. 스케줄 실행에서는 logical date가 데이터 구간의 시작을 가리키고, 실제 실행 시작은 logical date + 스케줄 간격 이에요. 그래서 "매일 자정 cron"이면 자정에 만들어지는 Dag Run의 logical date는 전날의 데이터 구간 시작을 가리키는 식이죠. 이 차이를 이해해야 "왜 오늘 실행인데 날짜가 어제지?"라는 헷갈림이 사라져요.

수동 실행 vs 스케줄 실행

DAG는 두 가지 경로로 실행돼요.

  • 트리거(triggered) — 수동 또는 API로 실행.
  • 스케줄(schedule) — DAG에 정의된 주기로 자동 실행.

수동으로 트리거하면 logical date는 트리거된 시각이고, 그 값이 시작 시각과 같아요. 스케줄로 실행되면 logical date는 데이터 구간 시작을 나타내고 시작 시각은 그 값 + 간격이죠.

백필(Backfill)과 캐치업(Catchup)

과거 기간에 대해 DAG를 돌리고 싶을 때 백필을 써요. 예를 들어 파이프라인을 고쳐 지난 3개월 데이터를 다시 처리하려면, 그 기간의 Dag Run들을 한 번에 만들어 실행할 수 있어요. 각 Dag Run은 그 기간의 날짜 하나를 데이터 구간으로 가져요.

관련 개념으로 catchup이 있어요. DAG를 처음 배포하면 과거 start_date부터 지금까지의 "놓친" 실행들을 따라잡을지(catch up)를 정할 수 있는데, 기본적으로 켜져 있으면 과거의 모든 스케줄 간격에 대해 Dag Run이 생겨요. 의도치 않게 과거 데이터를 일괄 재처리하고 싶지 않다면 catchup=False로 꺼두는 게 흔해요.

실제 적용 (데이터스케쳐스)

Events 파이프라인에서 스케줄링은 "데이터가 언제 창고에 반영되는가" 를 결정해요. 예를 들어 "매일 아침 2시에 어제 이벤트를 정제해 적재한다"를 schedule="0 2 * * *"로 정의하면, 그 DAG의 데이터 구간은 "어제 하루"가 돼요. 이렇게 하면 각 실행이 자기 구간의 데이터만 처리해, 중복 적재나 누락을 막을 수 있어요.

처음 도입할 때 놓치기 쉬운 게 logical date와 실제 실행 시각이 다르다는 점과 catchup이에요. 시작일을 과거로 잡고 배포하면 예상 밖으로 과거 실행들이 줄줄이 도는 경우가 있어서, 신규 파이프라인은 catchup=False로 시작하는 게 안전해요. 또 백필로 과거 데이터를 재계산해야 할 때를 대비해, 데이터 구간이 명확하게 유지되도록 설계해 두면 좋아요. DAG를 어떻게 구성하는지는 DAG 작성, 실행 단위는 오퍼레이터에서 이어져요.

더 알아보기