Skip to content

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 작성, 실행 단위는 오퍼레이터에서 이어져요.

더 알아보기