티스토리 뷰
반응형
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 의 커스텀 필터를 플러그인으로 등록해서 사용하는걸 추천한다.
커스텀 필터를 만드는법은 위 링크를 참고하자. 그럼 아래와 같은 표현이 가능하다.
{{ logical_date | basetime | ds }}
반응형
'데이터처리 > Airflow' 카테고리의 다른 글
[Airflow] 월말에 실행되는 배치 사이클 구성하기 - 28,29,30,31일 문제 (0) | 2025.02.06 |
---|---|
[Airflow] logical_date 를 타임존에 맞게 변환해서 쓰기 : custom filter 추가 (0) | 2025.02.04 |
[Airflow] crontab 표현시, 일부 날짜가 스케쥴이 안되는 문제 - 타임존영향 (0) | 2025.02.03 |
Airflow 2.x 의 주요 퍼미션별 권한 6개 상세 설명 : 캡쳐포함 (1) | 2024.08.28 |
[AIRFLOW] Variable.get() 의 성능 문제 해결방법 - 환경변수 활용법 (0) | 2023.12.15 |
댓글