티스토리 뷰

반응형

월별 지표를 만들기위해 말일에 스케쥴을 어떻게 할지 고민하다가, crontab 표현으로 28~31 활성화 하고, 체크로직을 넣어 실행을 제한하는식으로 접근을 했는데 마지막날이 스케쥴 안되는 문제가 발생했다. 

 

예를 들어, 아래와 같이 스케쥴을 걸면 10/28 , 10/29, 10/30, 10/31 이 스케쥴이 활성화 되면서 실행되길 기대했는데...

31일 스케쥴이 활성화가 안되는 상황이다.

with DAG(
    dag_id="sample_dag",
    start_date=datetime.datetime(2024, 10, 1, tzinfo=pendulum.timezone("Asia/Seoul")),
    schedule_interval="0 0 28-31 * *",  # 매월 말일 실행
    max_active_runs=1,  # 동시에 하나의 DAG만 실행
):
...

왜 2024-12-31 이 활성화 안되니?

해결방법

참고로 airflow 2.10.x 최신버전을 사용중이며, 날짜 바인딩도 지역시간으로 변경하기위해 필터를 커스텀하게 포함해서 사용중인데도 이런현상이 일어났다. 결론부터 말하면 스케쥴에서도 타임존을 선언해서 쓰는 방식을 써야 문제가 없다.

https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/timetable.html#crontriggertimetable

from airflow.timetables.trigger import CronTriggerTimetable
...
with DAG(
    dag_id="sample_dag",
    start_date=datetime.datetime(2024, 10, 1, tzinfo=pendulum.timezone("Asia/Seoul")),
    schedule=CronTriggerTimetable("0 0 28-31 * *", timezone="Asia/Seoul"),
    max_active_runs=1,  # 동시에 하나의 DAG만 실행
):

 

이제 잘됨

원인은?

한국의 경우 UTC 기준 +9시간이 더해지는 구조인데, 스케쥴이 UTC 기준으로 활성화 되고 이를 Asia/Seoul 로 맞출때의 영향으로 보인다. 내부적으로 만들어진 값이 Asia/Seoul 이라고 가정하고 이걸 UTC 랑 변환할때 뭔가 영향을 받아 일어난게 아닌가 싶다.

아래와 같은 시간을 그대로 돌려야 하는게 우리가 생각한건데. 

 

  • 2024-10-28T00:00+09
  • 2024-10-29T00:00+09
  • 2024-10-30T00:00+09
  • 2024-10-31T00:00+09

이게 뭔가 꼬여서 밀린게 아닌가 싶다. airflow 를 쓰면 이런 날짜가 항상 헛갈리고 힘든거 같다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함