Timetable 개요와 Trigger 계열 타임테이블
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation authoring-and-scheduling/timetable.rst - Timetables (개요), Built-in Timetables: DeltaTriggerTimetable, CronTriggerTimetable, MultipleCronTriggerTimetable
이 모듈을 다 읽으면
- Timetable이 Dag의 스케줄, data interval, logical date를 결정하는 역할을 설명할 수 있다
- 커스텀 Timetable이 필요한 대표적인 상황 네 가지를 설명할 수 있다
- DeltaTriggerTimetable/CronTriggerTimetable/MultipleCronTriggerTimetable의 차이와 선택 기준을 설명할 수 있다
시간 기반(이벤트 기반이 아닌) Dag는 내부적으로 '타임테이블'이 스케줄링과 data interval, logical date를 결정한다. cron 표현식이나 timedelta는 자동으로 내장 타임테이블로 변환되며, 더 복잡한 요구에는 커스텀 타임테이블을 쓸 수 있다. 이 모듈은 'Trigger' 계열 타임테이블 3종(Delta/Cron/MultipleCron)을 다룬다.
Timetable이란, 그리고 커스텀 Timetable이 필요한 경우
시간 기반으로 스케줄되는(이벤트 기반이 아닌) Dag는 내부의 '타임테이블(timetable)'이 스케줄링을 구동한다. 타임테이블은 스케줄 자체뿐 아니라 각 실행의 data interval과 logical date도 결정한다. cron 표현식이나 ``timedelta`` 객체로 스케줄된 Dag는 내부적으로 항상 타임테이블로 변환되어 처리된다. 대부분의 경우 cron이나 timedelta만으로 충분하며 Airflow의 내장 타임테이블이 이를 처리해주므로 커스텀 타임테이블을 만들 필요는 없지만, 더 복잡한 스케줄링 요구에는 직접 타임테이블 클래스를 만들어 ``schedule`` 인자에 넘길 수 있다. (일반 원칙으로, Variable·Connection 등 DB 접근이 필요한 값은 코드에서 최대한 늦게 조회하는 것이 권장된다.)
커스텀 타임테이블이 유용한 대표적인 경우 네 가지는 다음과 같다.
* 매일 다른 시각에 실행되어야 하는 태스크 — 예를 들어 전날 밤 수집된 데이터를 처리하기 위해 매일 해뜰 무렵 실행해야 하는 경우. * 그레고리력을 따르지 않는 일정 — 예를 들어 음력(전통 중국 달력)의 매달마다 실행. * 롤링/겹치는 데이터 인터벌 — 매일 실행하되 각 실행이 이전 7일을 커버해야 하는 경우. cron으로 억지로 구현할 수는 있지만 커스텀 data interval이 더 자연스럽다. * 인터벌 사이에 '구멍'이 있는 데이터 인터벌 — cron과 timedelta 스케줄은 항상 연속된 인터벌만 표현할 수 있기 때문이다.
핵심 포인트
- 타임테이블은 시간 기반 Dag의 스케줄뿐 아니라 각 실행의 data interval과 logical date까지 결정하며, cron/timedelta 스케줄도 내부적으로는 항상 타임테이블로 변환된다
- 커스텀 타임테이블이 필요한 대표 상황은 매일 다른 시각 실행, 비-그레고리력 일정, 롤링/겹치는 데이터 인터벌, 인터벌 사이에 구멍이 있는 스케줄 네 가지다
DeltaTriggerTimetable과 CronTriggerTimetable
'Trigger' 계열 타임테이블은 data interval 개념을 다루지 않고, 지정한 시점(또는 주기)에 그냥 Dag를 실행시키는 데 집중한다.
``DeltaTriggerTimetable``은 ``timedelta`` 또는 ``relativedelta``를 받아 그 간격이 지날 때마다 Dag를 실행한다.
@dag(schedule=DeltaTriggerTimetable(timedelta(days=7)), ...) # 매주 한 번
def example_dag(): ...
선택적 ``interval`` 인자(역시 timedelta/relativedelta)를 주면 트리거된 실행에 고정된 data interval을 부여할 수 있는데, 이 interval은 항상 트리거 시각에서 '끝나는' 것으로 계산된다. 예를 들어 매주 금요일 18:00에 실행하며 한 주 업무 기간(월요일 09:00 ~ 금요일 18:00, 즉 4일 9시간)을 커버하려면 ``DeltaTriggerTimetable(relativedelta(weekday=FR(), hour=18), interval=timedelta(days=4, hours=9))``처럼 쓴다.
``CronTriggerTimetable``은 cron 표현식을 받아 그 시점마다 Dag를 실행한다.
@dag(schedule=CronTriggerTimetable("0 1 * * 3", timezone="UTC"), ...) # 매주 수요일 01:00
def example_dag(): ...
마찬가지로 선택적 ``interval`` 인자로 트리거 시각에서 끝나는 고정 data interval을 지정할 수 있다.
핵심 포인트
- Trigger 계열 타임테이블은 data interval 개념 없이 지정 시점에 Dag를 실행하는 데 집중하며, DeltaTriggerTimetable은 timedelta/relativedelta 간격을, CronTriggerTimetable은 cron 표현식을 받는다
- 두 타임테이블 모두 선택적 interval 인자로 '트리거 시각에서 끝나는' 고정 길이 data interval을 부여할 수 있다
MultipleCronTriggerTimetable
``MultipleCronTriggerTimetable``은 ``CronTriggerTimetable``과 비슷하지만 여러 개의 cron 표현식을 받는다. 여러 표현식 중 '어느 하나라도' 매칭되는 시점마다 Dag run이 스케줄되며, 원하는 스케줄을 하나의 cron 표현식으로는 표현할 수 없을 때 특히 유용하다.
# 매일 1:10과 2:40에 실행
@dag(schedule=MultipleCronTriggerTimetable("10 1 * * *", "40 2 * * *", timezone="UTC"), ...)
def example_dag(): ...
``CronTriggerTimetable``과 동일하게 선택적 ``interval`` 인자를 지원한다.
핵심 포인트
- MultipleCronTriggerTimetable은 여러 cron 표현식 중 어느 하나라도 매칭되면 Dag를 트리거하며, 하나의 cron으로 표현할 수 없는 복합 스케줄에 유용하다