본문 바로가기

Minding's Programming/Airflow

[Airflow] Airflow의 날짜 개념

728x90
반응형

Airflow 날짜 Template 변수

 

Airflow는 Airbnb에서 개발 시 ETL 도구로써 개발했기 때문에, Airflow의 날짜 개념을 이해하기 위해서는 '데이터 관점'에서의 날짜를 바라볼 수 있어야 한다.

 

예를 들어 하루마다 주기적으로 수행되는 일 배치의 워크플로우가 있다고 생각해보자. 이 워크플로우는 배치 실행 일 기준 전 날 00시부터 23시 59분까지의 데이터를 추출하는 task를 가지고 있다.

그렇게 됐을 때, 데이터 관점에서의 시작 일은 배치를 실행하고 있는 오늘이 아닌 어제인 것이다.

(ex. 25일에 task 실행, 데이터는 24일 00:00~24일 23:59 까지의 데이터이므로 data의 시작 일은 25일이 아닌 24일)

 

이는 Airflow의 Template 변수를 출력해보아도 알 수 있다. 아래 템플릿들은 데이터 관점 기준 시작일을 나타낸다.

  • data_interval_start
  • dag_run.logical_date
  • ds (yyyy-mm-dd 형식 출력)
  • ts (타임스탬프)

그리고 아래 템플릿은 배치가 실행되었거나 실행되고 있는, 종료일을 나타낸다.

  • data_interval_end

 

모든 templates 변수 PythonOperator로 출력해보기

from airflow import DAG
import pendulum
from airflow.decorators import task

with DAG(
    dag_id = 'dags_python_show_templates',
    schedule = "30 9 * * *", # daily
    start_date = pendulum.datetime(2024, 7, 10, tz="Asia/Seoul"),
    catchup = True, # 7월 10일부터 현재 날짜까지를 모두 수행
    tags=["practice"]
) as dag:
    
    @task(task_id = 'python_task')
    def show_templates(**kwargs):
        from pprint import pprint
        pprint(kwargs)

    show_templates()

kwargs 딕셔너리에 따로 삽입을 하지 않은 채 kwargs 딕셔너리를 출력해보는 함수를 만들어서 실행시키는 DAG을 만들어보았다. 또한 catchup=True로 설정하여 7월 10일부터 현재날짜까지 모두 소급하여 워크플로우를 실행하도록 했다.

 

그리고 서버에 올려 DAG을 실행 시킨 뒤 소급 적용된 날짜 중 하루인 7월 18일의 log를 확인해보았다.

 

'data_interval_end': DateTime(2024, 7, 18, 0, 30, 0, tzinfo=Timezone('UTC')),
'data_interval_start': DateTime(2024, 7, 17, 0, 30, 0, tzinfo=Timezone('UTC')),
'ds': '2024-07-17',
'ds_nodash': '20240717',

 

위와 같이 7월 18일(9시 30분 실행)의 로그 데이터를 살펴본 결과, start 시간이 7월 17일 0시 30분, end 시간이 7월 18일 0시 30분으로 출력되었다. (UTC 기준으로 우리 나라 시간보다 9시간 느리다.) 위 데이터 관점의 시간 개념과 일치한다.

728x90