[Airflow] DAG에 스케줄 거는 방법 (DAG schedule_interval Setting)
데이터 엔지니어링에서 자동화 배치를 만들기 위해 Airflow를 자주 사용한다.
하나의 배치를 DAG이라 하는데, 배치를 만들면 당연히 자동적으로 수행하게 만들어야 한다. 이번 포스팅에선 dag을 자동적으로 실행하기 위해 스케쥴을 거는 방법을 살펴보자.
보통 DAG에 스케쥴을 거는 데에는 다음의 코드를 사용한다. 어떤 의미인지 하나씩 알아보자.
with DAG(dag_id=DAG_ID,
default_args=args,
start_date=datetime(2021, 1, 1, 0, 0, 0),
schedule_interval="0 0 * * *",
catchup=False
) as dag:
- start_date: DAG의 시작 지점
- execution_date: 해당 Task가 실행하고자 하는 Time window의 시작 지점
- catchup=True: start_date로부터 스케쥴링이 시작되는 날짜까지 시간 간격이 존재하는 경우 True 옵션을 주면 그 시간들에도 스케쥴링이 걸린다.
- True가 디폴트
- 보통 start_date는 과거로 해 놓고 스케쥴링은 미래 시점으로 걸고 싶으므로 catchup 옵션은 False를 주는 것이 일반적.
- schedule_interval: crontab을 활용하며, 스케쥴을 주기로 설정할 수 있다. 순서대로 “분, 시, 일, 월, 요일”을 뜻한다.
- 여기서 요일은 0, 7(일), 1(월) ~ 6(토)
- 예를 들어 “0 0 * * 1” 의 경우, 매주 월요일 UTC기준 0시 0분 마다 배치가 돈다는 의미.
- 예를 들어 “10 23 * * *”의 경우, 매일 UTC 23시 10분마다 배치가 돈다는 의미.
→ 그렇다면 위의 코드를 2021년 1월 1일에 실행한다고 하자. 그럼 start_date가 2021/01/01 이고, 매일 utc 0시에 실행되는 것이므로 1월 1일 자정을 기다리면 실행되어 있지 않을까?
⇒ 하지만 실행이 안 된다!
⇒ 첫 번째 작업은 2021년 1월 2일 0시에 시작된다. 왜일까?
✔️ 좀 더 쉬운 예시
당신이 쇼핑몰을 운영하는 사장이라고 하자. 그럼 2021년 1월 3일의 매출을 계산하고자 할 때, 언제 계산을 할 수 있을까?
당연히 2021년 1월 4일 자정이 되어야 1월 3일의 매출액 계산이 가능해진다.
즉 그림으로 나타내보면…
위처럼 나와야 1월 3일의 매출액 계산이 가능해질 것이다!
다시 그림으로 나타내 보면:
즉, execution_date는 해당 Task가 처리해야 할 데이터 기간의 시작 시점인 2021년 1월 3일을 의미합니다.
execution_date라는 이름을 직역하면 실행 날짜가 되기 때문에 그 의미와 실제 의미가 달라 자꾸 혼란이 발생하는 것이죠.
*추가로, start_date는 실제 실행 시간보다 무조건 과거 시점으로 적어 두어야 실행이 된다는 점 알아두자.
✔️ 적용해보기
이제 이해가 되었다면 적용해보자!
📍예시 1) Daily Scheduling
오늘 날짜는 2021년 12월 31일이다.
내년인 2022년 1월 1일부터, 매일 utc 기준 0시 0분에 배치가 돌게 스케쥴링을 하고 싶다면?
with DAG(dag_id=DAG_ID,
default_args=args,
start_date=datetime(2021, 12, 31, 0, 0, 0),
schedule_interval="0 0 * * *",
catchup=False
) as dag:
→ 가장 처음 실행이 시작되는 날짜는 2022-01-01 00:00이다.
추가로 execution_date는 2021-12-31 00:00이다.
(여기서는 daily 배치이므로 start_date를 days_ago(1)인 하루전으로 설정해 두어도 무방하다)
📍예시 2) Weekly Scheduling
오늘 날짜는 2022년 7월 11일이다.
다음 주인 2022년 7월 17일을 시작으로, 매주 일요일 utc 기준 5시마다 배치가 돌게 스케쥴링을 하고 싶다면?
with DAG(dag_id=DAG_ID,
default_args=args,
start_date=datetime(2022, 6, 6, 0, 0, 0), #start_date는 7/10 포함한 과거 시점 언제로도 설정 가능
schedule_interval="0 5 * * 0",
catchup=False
) as dag:
→ 가장 첫번째로 실행이 시작되는 시점은 2022-07-17 05:00 이다.
추가로 execution_date는 2022-07-10 05:00 이다.
여기서는 start_date를 2022-06-06 0시로 해두었는데, 2022-07-10을 포함한 과거 시점 언제로든 설정해두어도 무방하다.
실제로 내가 만들고자 하는 dag에 스케쥴링을 걸었더니 다음과 같이 원하는 대로 돌아간 것을 확인할 수 있다.
참고자료