Cron 표현식과 스케줄 프리셋
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation authoring-and-scheduling/cron.rst - Cron & Time Intervals, Cron Presets
이 모듈을 다 읽으면
- schedule 인자에 cron 표현식·timedelta·프리셋 중 무엇을 쓸지 상황에 맞게 선택할 수 있다
- Airflow가 지원하는 cron 프리셋 목록과 그 의미를 설명할 수 있다
- croniter의 확장 cron 문법 예시를 설명할 수 있다
Dag의 schedule 인자에는 표준 cron 표현식, datetime.timedelta 객체, 또는 @daily 같은 cron 프리셋을 지정할 수 있다. Airflow는 croniter 라이브러리로 cron을 파싱하므로 'MON#1'(매월 첫째 월요일) 같은 확장 문법도 쓸 수 있으며, 더 복잡한 요구에는 커스텀 타임테이블을 쓴다.
schedule 인자에 cron/timedelta/프리셋 지정하기
Dag는 ``schedule`` 인자에 cron 표현식, ``datetime.timedelta`` 객체, 또는 cron 프리셋 중 하나를 지정해 단순한 스케줄로 실행할 수 있다.
from airflow.sdk import DAG
import datetime
dag = DAG("regular_interval_cron_example", schedule="0 0 * * *", ...)
dag = DAG("regular_interval_cron_preset_example", schedule="@daily", ...)
dag = DAG("regular_interval_timedelta_example", schedule=datetime.timedelta(days=1), ...)
핵심 포인트
- schedule 인자에는 cron 표현식 문자열, datetime.timedelta 객체, 또는 @daily 같은 프리셋 문자열을 지정할 수 있다
Cron 프리셋 표
Airflow가 제공하는 프리셋과 그 의미는 다음과 같다.
| 프리셋 | 의미 | 대응 cron | |---|---|---| | None | 스케줄 없음, 오직 외부 트리거 전용 Dag | - | | @once | 딱 한 번만 스케줄 | - | | @continuous | 이전 실행이 끝나는 즉시 다시 실행 | - | | @hourly | 매시 정각(끝)에 한 번 실행 | 0 * * * * | | @daily | 매일 자정(24:00)에 한 번 실행 | 0 0 * * * | | @weekly | 매주 일요일 자정(24:00)에 한 번 실행 | 0 0 * * 0 | | @monthly | 매월 1일 자정(24:00)에 한 번 실행 | 0 0 1 * * | | @quarterly | 매 분기 첫날 자정(24:00)에 한 번 실행 | 0 0 1 */3 * | | @yearly | 매년 1월 1일 자정(24:00)에 한 번 실행 | 0 0 1 1 * |
핵심 포인트
- None은 외부 트리거 전용, @once는 단 한 번, @continuous는 이전 실행이 끝나자마자 다시 실행하는 특수 프리셋이고, 나머지(@hourly~@yearly)는 대응하는 cron 표현식으로 매핑된다
croniter의 확장 문법
Airflow는 ``croniter`` 라이브러리로 cron 표현식을 파싱하는데, 이 라이브러리는 표준 cron에 없는 확장 문법을 지원한다. 예를 들어 ``0 0 * * MON#1``은 '매월 첫째 주 월요일 자정 12시'를 뜻한다. Crontab guru 같은 온라인 편집기로 cron 표현식을 미리 검증해볼 수 있다. 더 정교한 스케줄링 요구에는 커스텀 타임테이블을 구현하는 것이 정석이다.
Dag는 지정된 스케줄마다 인스턴스화되며, 그때마다 백엔드 DB에 대응하는 Dag run 레코드가 함께 생긴다.
핵심 포인트
- Airflow는 croniter 라이브러리로 cron을 파싱하므로 'MON#1'(매월 첫째 월요일)처럼 표준 cron에 없는 확장 문법도 쓸 수 있다
- cron/timedelta/프리셋으로 표현하기 어려운 정교한 요구는 커스텀 타임테이블로 해결한다