airflow를 다루며 잘 이해가 되지 않았던 start_date와 execution_date에 대한 스터디
2022-11-14
1. 문제

- 2020-08-10 02:00:00로 start date로 설정된 daily job이 있다
- catchup이 True로 설정되어 있다고 가정 (디폴트가 True)
- 지금 시간이 2020-08-13 20:00:00이고 처음으로 이 job이 활성화되었다
- 질문: 이 경우 이 job은 몇번 실행될까? (execution_date)
2. 정답
- 질문: 이 경우 이 job은 몇번 실행될까? (execution_date) → 3번??? 왜?
- 2020-08-10 02:00:00
- 2020-08-11 02:00:00 실행 (execution_date : 2020-08-10 02:00:00)
- 2020-08-12 02:00:00 실행(execution_date : 2020-08-11 02:00:00)
- 2020-08-13 02:00:00 실행 (execution_date : 2020-08-12 02:00:00)
3. ?? 이해가 안 된다…
빡대가리같다. 문제를 직접 dag로 구현해서 이해해보자..
@dag(
dag_id="slack_test_2",
start_date=pendulum.datetime(2022, 11, 10, 2, 0, 0, tz="UTC"),
catchup=True,
schedule_interval="0 2 * * *",
default_args=default_args,
)
- start_date = 2022-11-10 02:00:00
- dag가 처음으로 읽어와야 하는 데이터의 날짜
- 처음으로 읽어와야하는 데이터의 날짜이기 때문에, 아래 2022-11-11 실행된 dag의 execution_date가 start_date(2022-11-10 02:00:00)와 동일한 것임
- dag를 enable시키는 오늘 날짜 = 2022-11-14 20:00:00
- 주기 = at 02:00 → 매일 02시 마다 실행
- 처음 실행하는 날짜는 start_date이후에 찾아오는 첫 번째 주기
4. 직접 실험한 결과
- 1번째 dag 실행 날짜 : 2022-11-11 02:00:00
- execution_date = 2022-11-10 02:00:00 = (Run ID)

- 2번째 dag 실행 날짜 : 2022-11-12 02:00:00
- execution_date = 2022-11-11 02:00:00 = (Run ID)

- 3번째 dag 실행 날짜 : 2022-11-13 02:00:00
- execution_date = 2022-11-12 02:00:00 = (Run ID)

- 4번째 dag 실행 날짜 : 2022-11-14 02:00:00
- execution_date = 2022-11-13 02:00:00 = (Run ID)

5. 내가 놓친 것
“dag 실행 날짜 ≠ execution_date”
→ execution_date는 start_date에서부터 시작해서 interval 만큼 차곡차곡 쌓여진 데이터의 날짜를 의미함
“주기? interval?”를 아는 것이 중요
- start_date 이후에 찾아오는 “주기”가 첫 번째 dag 실행 날짜가 되는 것임
- 예를 들어, daily job 이다 = “start_date에서 하루 지난 시점에 처음으로 dag를 돌리는데, 그때 사용하는 execution_date는 start_date와 동일함”
- 따라서 위의 문제에서는 daily job이므로 “주기”가 “하루”라는 의미이고, 현재 8월 13일 8시 일 때 지금까지 이 dag는 11일 02시, 12일 02시, 13일 02시 까지 총 3번 실행되었을 것임
확인 실험2
@dag(
dag_id="file_to_mongo_item_base",
catchup=True,
schedule_interval="*/5 * * * *",
start_date=pendulum.datetime(2022, 11, 14, 20, 0, 0, tz="UTC"),
max_active_runs=1,
default_args=default_args,
tags=["test", "base", "item"]
)
- 예상
- 첫 dag실행 날짜 : 2022-11-14 20:05:00
- execution_date = 2022-11-14 20:00:00 = (Run ID)
- 2번째 dag실행 날짜 : 2022-11-14 20:10:00
- execution_date = 2022-11-14 20:05:00 = (Run ID)
- …
- 결과
- 예상대로 작동함
