오늘은 Airflow에서 사용 가능한 템플릿 변수들에 대해 알아보도록 하겠다.
그 전에 "Jinja 템플릿"이란 무엇인지부터 알아보자!
Jinja 템플릿이란 파이썬 기반 웹 프레임워크(Flask, Django)에서 주로 사용하며,
HTML 템플릿 저장 후에 화면에 보여질 때 실제 값으로 변환해서 출력해주는 역할을 한다.
Airflow에서 Jinja 템플릿을 사용하는 방법은 매우 간단하다.
Operator 파라미터 입력 시, 아래와 같이 중괄호를 2개 이용하면.
Airflow에서 기본적으로 제공하는 변수들을 치환된 값으로 넣어줄 수 있다.
↓↓↓↓↓↓↓↓↓↓
ex) {{ data_interval_start }}
Airflow에서 기본적으로 제공하는 템플릿 변수들에 대한 공식 문서가 있으니 참고하길 바란다.
(매우 설명이 잘 되어 있어서 사실상 이것만 읽어도 될 듯...)
https://airflow.apache.org/docs/apache-airflow/stable/templates-ref.html
다만, 여기서 한 가지 주의할 점은 모든 operator 및 파라미터에 템플릿 변수가 적용 가능한 것은 아니라는 점이다.
요약하면 아래와 같이 파라미터 설명 부분에 "(templated)"라는 글자가 붙어있거나,
template_fields 값에 정의된 파라미터인 경우에만 Jinja 템플릿 사용이 가능하다!
(편의상 template_fields 값에 정의된 파라미터만 봐도 무방할 것 같다)
참고로 파이썬 operator는 **kwargs에 템플릿 변수들을 자동으로 제공해주고 있다!
(ex. kwargs['ds'], kwargs['ts'], kwargs['data_interval_start'], kwargs['data_interval_end'], ...)
자세한 내용은 아래의 Airflow 공식 문서에 적용 가능한 operator 및 파라미터가 나와 있으니 참고해서 사용하면 될 것이다.
https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/operators/index.html
다음으로 Airflow의 날짜 개념에 대해 한 번 정리하고 넘어가고자 한다.(내가 Airflow를 공부하면서 가장 헷갈렸던 부분이 바로 이 부분이다...)
가령, 2023/09/03 0시에 실행되는 Daily Batch Job이 있다고 가정해보자!
이 때의 데이터 관점의 시작일은 2023/09/02일 것이고,
데이터 관점의 종료일은 2023/09/03일 것이다.
말 그대로 데이터의 관점에서 봤을 때 2023/09/02 일자는 시작점이므로 data_interval_start,
2023/09/03 일자는 종료점이기 때문에 data_interval_end라는 템플릿 변수를 사용한다.
끝으로 Macro 변수에 대해 알아보도록 하겠다.
만약 매월 말일에 도는 스케줄인데, 배치일을 전월 마지막 일부터 어제 날짜까지 주고 싶다고 가정해보자.
이러한 경우는 앞서 말한 data_interval_start와 data_interval_end 템플릿 변수를 어떻게 처리해주면 좋을까?
여기서부터는 날짜 연산이 필요한데, 이러한 경우에 사용하는 것이 바로 Macro 변수이다.
Airflow는 템플릿 변수를 기반으로 다양한 날짜 연산이 가능하도록 아래와 같이 연산 모듈을 제공하고 있으며,
주로 datetime과 dateutil 모듈이 많이 쓰인다.
위 연산 모듈은 파이썬 라이브러리와 동일한 방식으로 사용이 가능하기 때문에,
Macro 변수를 잘 활용하려면 파이썬 라이브러리인 datetime과 dateutil에 익숙해질 필요가 있다.
from datetime import datetime
from dateutil import relativedelta
now = datetime(year = 2023, month = 9, day = 3)
print(str(now)) # 현재 시간
print(now + relativedelta.relativedelta(month = 1)) # 1월로 변경
print(now.replace(month = 1)) # 1월로 변경
print(now + relativedelta.relativedelta(months = -1)) # 1개월 빼기
print(now + relativedelta.relativedelta(day = 1)) # 1일로 변경
print(now.replace(day = 1)) # 1일로 변경
print(now + relativedelta.relativedelta(days = -1)) # 1일 빼기
print(now + relativedelta.relativedelta(months = -1) + relativedelta.relativedelta(days = -1)) # 1개월, 1일 빼기
여기까지 해서 Airflow의 템플릿 변수에 대해 알아보았다.
그 중에서도 특히 Airflow 날짜 개념과 관련된 부분은 지금 정확하게 이해하고 넘어가야 나중에 헷갈리지 않는다..
그럼 오늘의 포스팅은 여기서 끝!
<Reference>
- 김현진님의 인프런 Airflow 마스터 클래스 강의
'Data Engineering > Hadoop Ecosystem' 카테고리의 다른 글
[Airflow Master Class] Cron 스케줄 (0) | 2023.08.23 |
---|---|
[Airflow Master Class] Docker 및 Airflow 설치 (0) | 2023.08.20 |
[Airflow Master Class] WSL 설치 & 리눅스(Linux) 기본 명령어 (0) | 2023.08.20 |
[FastCampus-DE] 4. Hadoop & HDFS (0) | 2022.07.27 |
[FastCampus-DE] 3. 빅데이터 플랫폼과 Hadoop Ecosystem (0) | 2022.07.26 |