Airflow는 batch 스케줄링을 위한 tool인만큼 사용하다보면 start_date, execution_date, schedule_interval등 날짜에 관련된 개념을 자주 마주하게 됩니다. 그러나 Airflow만의 독특한 날짜 개념도 있어 처음 사용할 때 혼동이 되는 경우가 많아 이를 간략하게 정리해보고자 합니다.
start_date
args = {
"owner": "kyoon",
"depends_on_past": False,
"start_date": datetime(2022, 10, 27, tzinfo=local_tz),
"end_date": datetime(2022, 12, 27, tzinfo=local_tz),
"on_success_callback": alert.slack_success_alert,
"on_failure_callback": alert.slack_fail_alert
}
- DAG 구동의 기준점이 되는 시간
- start_date는 한번 등록되면 DAG 파일에서 수정한다고 해도 업데이트 되지 않기 때문에 수정을 원할 시, DAG를 삭제한 후 새로 등록해야함
- end_date를 설정하면 DAG의 실행 중지 날짜를 지정할 수 있음
- DAG 클래스의 입력 파라미터 값들로 start_date(시작 시간)과 schedule_interval(실행 주기)를 입력하게 되는데 보통의 경우, 시작 시간부터 스케줄링이 시작된다고 생각하지만 airflow는 아래와 같이 작동되도록 설계
DAG run = start_date + schedule_interval
-> 예를 들어 start_date=datetime(2022.11.1), schedule_interval=@monthly의 스케줄을 가지는 DAG가 있고 실행시점은 11/27 5:48이라고 가정하면 이 DAG의 첫 실행일은 12/1 자정
schedule_interval
@dag(
default_args=args,
description="파이프라인",
schedule_interval="30 2 * * *",
...
)
- DAG의 실행주기
Airflow 매프로 프리셋
/ Cron
/ 빈도
의 방법으로 스케줄을 정의할 수 있음
execution_date
- execution_date는 실행날짜가 아니라
주문번호(run id)
에 가까움
- 한 가지 예를 들어 살펴보자. 매일 자정, 전날에 발생했던 log들을 es에 적재하는 작업이 있다고 가정한다면 자정이 지나 오늘의 날짜는 2022-12-28일인데 이관되어야 하는 log들의 날짜는 2022-12-27일이 된다. 이런 경우 사용자는 (오늘 날짜-1)을 하여 데이터를 가지고 오면 되는데 Airflow는 이를 execution_date라는 것으로 대신 사용할 수 게 해줌. 결국 실행되는 날짜는 2022-12-28이지만 execution_date는 2022-12-27이 됨.
- 나중에 해당 job을 다시 실행해도 execution_date는 그대로 유지.
- 멱등성 유지
- 다음날 job을 clear 후 재실행해도 execution_date는 처음 실행 때 할당된 값에서 변경되지 않음.
- backfill 이나 task re-run 시, 유용
- Airflow에서는 job에서 사용되는 date값에 dynamic value인 now()보다 execution_date를 쓸 것을 권고.
- 주의할 점은, executiondate는
UTC(KST - 9h)
를 기준으로 한다는 것.
- _KST : 2022-12-28 20:00:00 / UTC : 2022-12-28 11:00:00 / execution_date : 2022-12-27 11:00:00
- KST : 2022-12-28 00:00:00 / UTC : 2022-12-27 15:00:00 / execution_date : 2022-12-26 15:00:00
execution_date 대신 쓸 수 있는 date 변수
참고