이전 포스팅에서 bash operator를 이용해 템플릿 변수를 출력해봤는데, 치환된 값이 어떤 값인지 이해하기 위해서 먼저 Airflow에서의 날짜개념을 짚고 넘어가야 할 필요가 있습니다.
1. Airflow 날짜 Template 변수 이해
먼저, 데이터 추출 예시를 살펴봐봅시다.
(ex) 등록 테이블
REG_DATAE | NAME | ADDRESS |
2023-02-24 15:34:35 | 홍길동 | Busan |
2023-02-24 19:14:42 | 김태희 | Seoul |
2023-02-24 23:52:19 | 조인성 | Daejeon |
Daily ETL 처리를 위한 조회 커리 (2023/02/25 0시 실행) 라고 가정합시다.
(그렇게 되면, 24일에서 25일 사이의 데이터를 가져오는 셈이겠죠?)
쿼리를 작성해보면 아래와 같습니다.
SELECT NAME, ADDRESS
FROM TBL_REG
WHERE REG_DATE BETWEEN TIMESTAMP('2023-02-24 00:00:00')
AND TIMESTAMP('2023-02-24 23:59:59')
여기서, 현재 배치를 도는 시점은 2월 25일 0시로 25일인데,
데이터 관점에서 봤을 때는, 데이터 추출범위의 시작점은 24일이고 끝점은 25일입니다.
데이터 관점의 시작일: 2023-02-24
데이터 관점의 종료일: 2023-02-25
즉, 실제 배치가 도는 일자와 데이터 관점에서 시작점과 끝점이 다를 수가 있다는 뜻입니다.
2. Airflow 날짜 Template 변수
: Airflow는 airbnb에서 만들었는데, Airflow를 만들 때, ETL 도구로서 만들었습니다. 그러다보니, Airflow에는 데이터관점에서 날짜를 바라보는 사상이 담겨져 있는데, 그런 사상이 무엇인지 그림을 그려 설명해보겠습니다.
executiion_date는 data_interval_start 의 예전 용어인데, 이름이 execution이다 보니, 사람들이 헷갈려해서 이름이 바뀌었습니다. next_execution_date라 하면, 다음 번에 돌 날짜라고 생각하기 마련인데, 이전버전에서는 next_execution_date 는 배치가 돌고 있는 현재 날짜를 뜻했습니다.
그래서, airbnb에서 현재 버전 부터는 data_interval_start 와 data_interval_end라고 이름을 바꿨습니다.
중요한 것은 배치가 돌고 있는 현재 날짜를 꺼내고 싶다면, "data_interval_end"를 꺼내야 하고, 이전 배치날짜를 꺼내고 싶으면 "data_interval_start"라고 하는 파라미터를 꺼내야 합니다.
이제 템플릿에서 적용해주고 있는 모든 날짜 변수들을 파이썬 오퍼레이터로 찍어봅시다.
dags_python_show_templates.py 라는 파일을 생성해주고, 아래와 같이 코드를 짭니다.
from airflow import DAG
import pendulum
import datetime
from airflow.decorators import task
with DAG(
dag_id = "dags_python_show_templates",
schedule="30 9 * * *",
start_date=pendulum.datetime(2023,8,10,tz="UTC"),
catchup=True
) as dag:
@task(task_id='python_task')
def show_templates(**kwargs):
from pprint import pprint
pprint(kwargs)
show_templates
스케줄을 데일리 테스트로 줬고, 현재 UTC 기준으로 8월 26일인데, 날짜는 8월 10일로 줬습니다. 그리고 평소와는 다르게, catchup 변수를 True로 줬습니다. 이는 8월 10일부터 8월 26일까지의 구간을 모두 수행하겠다는 의미입니다.
task decorator를 이용해서 파이썬 오퍼레이터를 만들었는데, **kwargs를 줬습니다. 그리고, kwargs 값을 출력해보면서 kwargs에 어떤 값들이 있는지 알아볼 것입니다.
이전에, kwargs를 이용해서 파라미터를 넘기는 것을 해봤었는데, 지금은 아무런 파라미터를 넘기지 않았는데, kwargs 값을 찍어보는 것이 무슨 소용이 있겠냐고 생각하실 수 있습니다. 한 번 값을 airflow에서 살펴보시죠.
(※ pprint는 print문인데, 줄넘김이 되어 조금 더 출력이 깔끔하게 나오는 print 입니다.)
8월 15일 9시 30분 기준으로 돌았던 배치를 확인해봅시다.
생각보다 많은 값들이 kwargs에 담겨져있습니다.
'data_interval_end'와 'data_interval_start'가 가장 먼저 눈에 띄는데요, 배치일 기준으로 8월 15일에 수행된 task의 로그이므로, end가 15일 start가 14일인 것을 확인할 수 있습니다.
또한, 'ds'와 'ds_nodash' 둘 다 'data_interval_start' 와 같은 날짜 14일인 찍힌 것도 확인할 수 있구요.
'logical_date' 라는 변수도 있는데요, 이 또한 'data_interval_start'와 같은 의미입니다.
그리고, execution_date는 더이상 쓰이지 않는 파라미터이기에, 'deprecated'라고 뜨는데, 그래도 값을 확인해보면, 8월 14일이라는 것을 확인할 수 있습니다.
'next_ds' 나 'next_ds_nodash'나 'next_execution_date' 또한 다 deprecated 예정입니다.
이 외에도, 'prev_ds', 'prev_ds_nodash', 'prev_execution_date', 'prev_execution_date_success', 'prev_start_date_success' 등 도 다 deprecated 될 예정입니다. 'tomorrow_ds'와 'tomorrow_ds_nodash' 변수도 마찬가지입니다.
이 외에, 'ts' 라는 날짜 변수가 있는데요, 타임스탬프입니다. 이 값 또한, 'data_interval_start'와 같은 값을 가집니다. 'ts_nodash' 도 마찬가지이구요.
이렇게, Jinja 템플릿에서 제공해주는 날짜변수들을 살펴봤습니다.
Airflow는 데이터 관점에서 날짜를 바라보는 사상이 담겨습니다. 그래서 우리가 Jinja템플릿에서 날짜를 꺼낼 때, 배치를 꺼내고 싶으면, 'data_interval_end' 를 꺼내야 하고, 그것보다 한 번 이전의 스케줄 날짜를 꺼내려면, 'data_interval_start', 'ds' 혹은 'ts', 'logical date'같은 값들을 꺼내면 됩니다.
실제 dag을 만들다보면 'data_interval_end' 즉, 배치가 돌고 있는 현재 날짜 기준으로 작업하는 경우가 많을텐데, 이를 활용하면 되겠죠?
이상으로, Airflow의 날짜 개념에 대해 알아봤습니다!
'컴퓨터 공부 > 💿 Airflow' 카테고리의 다른 글
[Airflow] Bash Operator with macros (0) | 2023.08.28 |
---|---|
[Airflow] Python Operator에서 Jinja 템플릿 사용하기 (0) | 2023.08.28 |
[Airflow] Bash 오퍼레이터 with Template (0) | 2023.08.26 |
[Airflow] Jinja 템플릿 (0) | 2023.08.25 |
[Airflow] Python Operator에 op_kwargs로 변수 할당하기 (0) | 2023.08.25 |