티스토리 뷰

반응형

airflow 2.x 로 올라가면서 ui 에서 타임존을 고려한 처리가 좋아지긴했는데, DAG 를 만들때 logical_date 를 이용해 값을 유도할때 우리가 의도한 값이 안나올때가 있다. 우선 airflow 의 환경변수기반으로 구성했다는 가정으로 타임존을 아래와 같이 구성하고

export AIRFLOW__CORE__DEFAULT_TIMEZONE="Asia/Seoul"
export AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE="Asia/Seoul"

 

DAG 선언할때도 start_date 값에 타임존까지 잘 지정했다면 반은 성공한것이다.

 

근데 , 2024-01-02 00:00 가 되면 2024-01-01 00:00 의 logical_date 가 바인딩될것으로 기대되는데 이상하게

{{ logical_date | ds }} 값이 2023-12-31 으로 밀려있을것이다. 시간까지 찍어보면 9시간의 차이가 발생될텐데 이건 UTC 와 한국시간의 차이문제이다.

import datetime
import pendulum
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.empty import EmptyOperator

with DAG(
    dag_id="my_sample_dag",
    start_date=datetime.datetime(2023, 1, 1, tzinfo=pendulum.timezone("Asia/Seoul")),
    schedule="@daily",
    max_active_runs=3,  # 동시에 하나의 DAG만 실행
):
    start = EmptyOperator(task_id="start")
    run = BashOperator(
        task_id="echo", b
        bash_command="echo '{{ logical_date | ds }}'"
    )
    start >> run

 

 

완벽하게 해결하려면 logical_date 를 재계산 해야함

이 문제를 깔끔하게 해결하려면 logical_date 를 그대로 쓰지 않고, 타임존을 고려한 값으로 변환후 사용해야한다.

airflow 에서는 일부 코드가 UTC 로 가정되어 처리하는 로직이 있는지 뭔가 문제가 있는것 같다.

타임존을 고려해서 재계산을 해야하는데 매번 코드로 표현하는건 번거롭기 때문에 jinja template 의 커스텀 필터를 플러그인으로 등록해서 사용하는걸 추천한다.

 

https://ngela.tistory.com/177

 

커스텀 필터를 만드는법은 위 링크를 참고하자. 그럼 아래와 같은 표현이 가능하다.

{{ logical_date | basetime | ds }}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함