[Airflow] start_date & execution_date

zuckerfrei·2024년 2월 8일
0

Airflow

목록 보기
1/1

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"),
    # max_active_runs=1,
    catchup=True,
    schedule_interval="0 2 * * *", # at 02:00
    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 * * * *",  # every 5 min
    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)
  • 결과
    • 예상대로 작동함
profile
무설탕 음료를 좋아합니다

0개의 댓글