개요
매 달 또는 분기별 첫 번째 주 월요일에 DAG 스케쥴링 설정을 하고자 한다. 즉, 2021.06.24 - crontab - 매달 N번째 특정 요일에 실행시키기와 동일한 스케쥴링을 Airflow에서 설정해보려고 한다.
Airflow DAG를 스케쥴링할 때는 cron 표현식을 사용하므로 속성과 값의 범위, 특수 문자를 이용해 스케쥴링할 것이다.
cron 표현식
Airflow DAG를 스케쥴링할 때는 cron 표현식을 사용할 수 있다.
속성 | 필수 | 유효 값 | 유효 특수 문자 | 비고 |
분 | O | 0–59 | * , - | |
시간 | O | 0–23 | * , - | |
날짜 | O | 1–31 | * , - ? L W | 일부 구현에서만 '?', 'L', 'W' 허용 |
월 | O | 1–12 또는 JAN–DEC | * , - | |
요일 | O | 0–6 또는 SUN–SAT | * , - ? L # | 일부 구현에서만 '?', 'L', 'W' 허용 |
년도 | X | 1970–2099 | * , - | 이 필드는 표준/기본 구현에서 지원되지 않습니다. |
cron 특수 문자
cron에서 사용할 수 있는 특수 문자는 다음과 같다.
기호 | 기능 | 예시 |
, | 목록의 항목 구분 | 0 0 * * MON,WED,FRI |
- | 범위 정의 | 2000-2010 |
% | 명령어 개행 문자 | |
L | 마지막(Last)을 의미 요일 필드에서는 달의 마지막 특정 요일 날짜 필드에서는 달의 마지막 날 * 일부 구현에서만 허용 |
0 0 * * L5 매달 마지막 금요일 |
W | 날짜 속성에 사용. 지정한 날짜에 가장 가까운 평일을 지정한다. 단일 날짜에만 사용할 수 있다. * 일부 구현에서만 허용 |
0 0 15W * * 풀이 : 15일이 토요일이면 14일 금요일에 트리거된다. |
# | 요일 속성에 사용. 1 ~ 5 사이의 숫자 뒤에 #이 붙고, # 뒤에는 n번째 주를 의미하는 숫자를 지정한다. * 일부 구현에서만 허용 |
0 0 * * 5#3 매월 셋째 주 금요일 |
? | 날짜, 요일 속성의 공백 대체 cron 데몬 시작 시각 의미 일부 구현에서만 허용 |
|
/ | 값의 step을 지정한다. | */5 * * * * 매시 5분 마다 |
이 글에서는 N번째 특정 요일마다 실행하고자 하므로 cron 특수 문자 중 #를 사용하는 것을 고려할 수 있다.
사용 예시
Airflow에서는 # 문자를 사용할 수 있다. 따라서 아래와 같이 schedule_interval을 지정할 수 있다.
dag = DAG(
dag_id='schedule_test',
catchup=False,
schedule_interval='0 0 * * 1#2',
start_date=datetime.datetime(2021, 1, 1),
)
예시의 스케쥴은 매월 두 번째 주 월요일 0시 0분에 실행하는 스케줄이다. backfill을 이용해 예시의 DAG의 2개월 동안의 실행을 살펴보면 다음과 같이 dag run이 생성되어 실행된다.
airflow dags backfill -s 2022-08-01 -e 2022-10-31 schedule_test
# dag run 확인
airflow dags list-runs -d schedule_test
참고 문서
https://stackoverflow.com/questions/72372918/airflow-dag-to-run-3rd-monday-of-the-month
https://en.wikipedia.org/wiki/Cron#CRON_expression
https://www.gnu.org/software/mcron/manual/html_node/Crontab-file.html