데이터 엔지니어링/AirFlow

[Airflow] 기반의 데이터 파이프라인(3) - 스케줄링

안용감한호랑이 2023. 10. 12. 01:07

Airflow는 DAG에 적절한 값을 통해 스케줄 간격을 정의하여 정기적으로 실행할 수 있다.

DAG를 초기화할 때 schedule_interval을 설정하여 스케줄 간격을 정의할 수 있다.

해당 값의 default는 None이며 DAG가 예약 실행되지 않고, UI 또는 API를 통해서 수동으로 트리거 된다.

 

1. 스케줄 간격 및 시작 날짜 정의

import datetime as dt

# ...생략...

dag=DAG(
	dag_id="schedule_examples",
    schedule_interval="@daily",         # 매일 자정에 실행되도록 DAG를 스케줄하는 매크로
    start_date=dt.datetime(2023.1.1),   # 2023.1.1 부터 DAG 실행 스케줄을 시작할 날짜/시간
    end_date=dt.datetime(2023.12.31),   # 2023.12.31 까지 DAG가 실행된다.
    # ...생략...
)

 

만일 오늘 날짜가 2023.1.1 이라면

위와 같은 스케줄에서는 start_date에 의해 가장 빠른 자정인 2023.1.2 00:00에 DAG를 실행하게 된다.

동일하게 end_date에 의해 2023.12.31 00:00에 해당 DAG의 스케줄은 종료된다.

 

 

2. Cron 기반의 스케줄 간격 설정

Cron 이란 unix기반 OS에서 사용하는 시간 기반 스케줄러이다.

총 5개의 구성요소가 있으며 차례대로 분, 시간, 일, 월, 요일 을 가르킨다.

# 정시 수행
0 * * * *

# 매일 수행
0 0 * * *

# 매주 일요일 수행 (일 ~ 월 : 0 ~ 6)
0 0 * * 0

# 매일 00시 12시 수행
0 0,12 * * *

 

 

3  Airflow의 스케줄 간격 약어(매크로)

@once    : 1회만 실행하도록 스케줄
@houly   : 매시간 변경 시 1회 실행
@daily   : 매일 자정에 1회 실행
@weekly  : 매주 일요일 자정에 1회 실행
@monthly : 매월 1일 자정에 1회 실행
@yearly  : 매년 1월 1일 자정에 1회 실행

 

 

4 빈도 기반의 스케줄 간격 설정

Cron으로는 3일 간격으로 실행해야 하는 스케줄은 매달 30, 31일, 1일 등으로 인해 표현이 불가능하다.

ex > 1,4,7,...,31 ( 31일과 1일의 간격은 하루 이다)

 

그렇기 때문에 datetime 모듈에 포함된 timedelta를 이용하여 스케줄을 정의한다.

import datetime as dt

# ...생략...

dag=DAG(
	dag_id="schedule_examples",
    schedule_interval=dt.timedelta(days=3), # DAG가 시작 시간으로부터 3일마다 실행된다
                                            # 현재 최초 실행은 2023.1.4일이다.
                                            # timedelta(minutes=10), timedelta(hours=2) 또한 가능
    start_date=dt.datetime(2023.1.1),       # 2023.1.1 부터 DAG 실행 스케줄을 시작할 날짜/시간
    end_date=dt.datetime(2023.12.31),       # 2023.12.31 까지 DAG가 실행된다.
    # ...생략...
)