HAZEL

[ Airflow ] Scheduling 개념 / execution_date 본문

DATA ENGINEERING/Data Engineering

[ Airflow ] Scheduling 개념 / execution_date

Rmsid01 2022. 4. 29. 20:17

1. 스케쥴링 개념

Airflow 에서 start_date / execute_date 는 매우 헷갈리는 개념이다.

  • start_date : DAG 스케쥴이 시작되는 시간(날짜)
  • execution_date : 스케쥴을 한시간에 한번이라면, DAG 실행 한시간 전에 대한 시간
    • 모든 문서에서 보면, execution_date를 date로 받아들이지 말고, dag 의 고유 실행 id 로 받아들이라고 한다.
    • 그런 의미에서, 추후에 backfill 을 하더라도, 즉 나중에 해당 dag를 다시 실행하더라도 execution_date는 그대로 유지 된다.

 

2. 스케쥴링 테스트

1. catchup = False , schedule_interval = '*/15 * * * *'

  • code
 
dag = DAG(
    dag_id='date_test_dag_v1',
    start_date=datetime(2022, 4, 1, tzinfo=korea_tz),
    catchup=False,
    schedule_interval='*/15 * * * *'
)
  • DAG 업로드 시간 : 2022.04.21 10:05
  • DAG 반복 주기 : 15분에 한번씩
  • CATCH UP : False
    • False 이기 때문에, 업로드 당시, 재시작 당시 한번만 DAG 실행 되며, 그 이전에 대한 DAG는 실행 되지 않음
    • 멈췄다가 재 실행하더라도, 이전 DAG를 실행 x

 

 

 

2. catchup = True , schedule_interval = '*/60 * * * *'

  • code
 
dag = DAG(
    dag_id='date_test_dag_v2',
    start_date=datetime(2022, 4, 20, tzinfo=local_tz),
    catchup=True,
    schedule_interval='*/60 * * * *',
        default_args={
        'retries': 1,
        'retry_delay': timedelta(minutes=3)
    }
)
  • DAG 업로드 시간 : 2022.04.21 15:59
  • DAG 반복 주기 : 1시간에 한번씩
  • CATCH UP : True
    • True 이기 때문에, 업로드 당시, 4월 20일 3시 DAG부터 한번에 25개가 실행 됨. ( 순서대로 실행되기 때문에, 시간차 존재하긴 함. 그러나 한번에 켜짐 )
      • 사실 DAG 는 25개나, 한번에 켜지기때문에 느려져 재 실행되고, 그래서 Runs가 40개가 찍히는것으로 보인다.
    • 멈췄다가 다시 실행할 때, 역시 멈춘동안 돌지 못한 DAG 도 함께 실행된다.
DAG 올리는 순간, 25개가 한번에 실행된 모습
 
  • 특이점 : 4월 20일이라고 설정하더라도 00시부터 시작하는 것이 아니라, 4시에 돌아가는 3시부터 시작되는 것으로 보인다.
 

 

3. Catch up 을 설정했을 때(True)와 아닐 때(False), 가져올 데이터를 어떻게 구별하는가?

Q. Backfill 을 실행하여 ‘과거 데이터’만을 가져오거나 ?! 혹은 Catch up을 하여 이전 DAG를 실행하여 ‘이전 데이터’를 가져온다!? 그렇다면, ‘이전 데이터’라는 것은 어떻게 아는가?!

A. execution_date 를 사용하여, 코드에 날짜 조건을 걸어주어 사용한다.

 

 

실제, 코드가 전체 데이터를 가져와서 사용하는 경우 ( 혹은 날짜와 관련 없는 데이터의 경우 ) 에는 catch up 설정 혹은 backfill 에 대해서 신경쓰지 않아도 되는 것으로 보인다.

즉, 여러번 실행 했을 때나, 한번만 실행 했을 때나 DAG 실행 당시까지 쌓인 전체 데이터를 가져와서 처리한다.

 

그러나, execution_date 가 의미가 있으려면, execution_date로 코드 상에서 조건을 걸어주어 해당 날짜 이후 데이터 혹은 이전의 데이터를 가져오는 식으로 사용한다.

 

 

참조 : 오늘의 집 기술 블로그 [ 링크 : 버킷플레이스 Airflow 도입기 - 오늘의집 블로그 ]

- 변수로 받는 DATE 는 execute date 만 가능하다.

 

4. DAG 가 에러가 나온다면? execution_date는 어떻게 되는가?

그냥 무시하고 증가된다. 따라서 execution_date 를 이용하려면 처리가 필요해 보인다.

→ 그래서 backfill 이라는 개념이 편하게 동작되는 것으로 보인다.