[Airflow] date 및 스케줄 개념

v K_Y v·2023년 2월 7일
0

AIRFLOW

목록 보기
2/4

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 변수


참고
profile
📌 기억하기 위해 남기는 기록들

0개의 댓글