본문 바로가기

Data Mining & Distributed/Airflow

[ Airflow ] start_date, schedule 설정하기(1년 주기)

반응형

Airflow에서 1년에 1번 실행하는 DAG의 경우, execution_date가 실제 실행 시간보다 1년 전이어야 하는지 여부는 Airflow의 스케줄링 동작과 관련이 있습니다.

 

1. Airflow의 동작 원리

  1. execution_date의 의미
    • execution_date는 DAG 실행이 예약된 날짜를 나타냅니다.
    • 실제 DAG가 실행되는 시간은 execution_date 이후입니다.
    • 예:
      • start_date=datetime(2023, 1, 1)이고 schedule_interval='@yearly'이면, DAG는 2023년 데이터를 처리하기 위해 2024년 1월 1일에 실행됩니다.
  2. 실행 주기의 타임라인
    • Airflow는 schedule_interval에 따라 스케줄링을 계산하며, DAG는 항상 이전 주기를 처리합니다.
    • 1년에 1번 실행하는 DAG의 경우:
      • 2023년 1월 1일 데이터를 처리하기 위해 2024년 1월 1일에 실행됩니다.
      • 2024년 1월 1일 데이터를 처리하기 위해 2025년 1월 1일에 실행됩니다.
  3. start_dateexecution_date의 관계
    • start_date는 스케줄 계산의 기준이 되는 날짜입니다.
    • execution_date는 해당 DAG가 처리할 데이터의 기준 날짜입니다.

 

2. 예제

설정 1: start_date=datetime(2023, 1, 1)

from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from datetime import datetime

default_args = {
    'owner': 'airflow',
}

with DAG(
    'yearly_execution_example',
    default_args=default_args,
    start_date=datetime(2023, 1, 1),
    schedule_interval='@yearly',
    catchup=True,
) as dag:
    task = DummyOperator(task_id='run_once_a_year')
  1. 스케줄 계산:
    • start_date=datetime(2023, 1, 1)
    • schedule_interval='@yearly'
  2. 실행 결과:
    • 2024년 1월 1일: 2023년의 execution_date에 대해 실행됨.
    • 2025년 1월 1일: 2024년의 execution_date에 대해 실행됨.

설정 2: start_date=datetime(2024, 1, 1)

with DAG(
    'yearly_execution_example_future',
    default_args=default_args,
    start_date=datetime(2024, 1, 1),
    schedule_interval='@yearly',
    catchup=False,
) as dag:
    task = DummyOperator(task_id='run_once_a_year')
  1. 스케줄 계산:
    • start_date=datetime(2024, 1, 1)
    • schedule_interval='@yearly'
    • catchup=False
  2. 실행 결과:
    • 2025년 1월 1일: 2024년의 execution_date에 대해 실행됨.
    • 과거(2023년)의 execution_date는 건너뜀.

설정 3: start_date=datetime(2024, 1, 1)

with DAG(
    'yearly_execution_example_future',
    default_args=default_args,
    start_date=datetime(2024, 1, 1),
    schedule_interval='@yearly',
    catchup=False,
) as dag:
    task = DummyOperator(task_id='run_once_a_year')
  1. 스케줄 계산:
    • start_date=datetime(2023, 6, 1)
    • schedule_interval='0 24 1 6 *' (현재가 24년일 경우)
    • catchup=False
  2. 실행 결과:
    • 2024년 6월 1일: 2024년의 execution_date에 대해 실행됨.

 

3. 왜 execution_date가 1년 전처럼 보이는가?

  1. Airflow는 과거 데이터를 처리하기 위해 설계됨:
    • DAG의 실행은 항상 execution_date를 기준으로 하며, 이는 현재 실행 시간보다 이전입니다.
    • 예: 매년 데이터를 처리하는 DAG는 보통 1년 전 데이터를 처리하도록 설정됩니다.
  2. schedule_interval='@yearly'의 동작 방식:
    • 스케줄은 start_date를 기준으로 1년 단위로 생성되며, 실행은 다음 주기에 발생합니다.

 

4. 1년 전이 아닌 설정이 필요한 경우

만약 실행 시간과 execution_date가 동일하도록 설정하고 싶다면 timedelta를 사용해 조정해야 합니다. 하지만 이는 일반적으로 권장되지 않으며, Airflow의 기본 동작을 따르는 것이 더 적합합니다.

 

5. 요약

  • Airflow에서 execution_date가 1년 전처럼 보이는 이유는 Airflow의 과거 데이터를 처리하는 설계 때문입니다.
  • DAG가 실행되기 위해 execution_date가 반드시 1년 전일 필요는 없습니다. 그러나 1년에 한 번 실행하는 스케줄에서는 실행일이 과거 데이터를 처리하는 날짜로 나타납니다.

 

6. 결론

execution_date는 반드시 1년 전일 필요는 없습니다. 하지만 Airflow의 스케줄링 동작상, 1년에 1번 실행하는 DAG는 과거 데이터를 처리하는 패턴으로 동작하며, 일반적으로 1년 전 데이터를 처리하기 위한 실행 시점으로 간주됩니다.
따라서 start_date를 1년 전으로 설정을 해야 현재 시점 부터 1년 안에 실행될 설정된 1년 주기 실행을 하게 됩니다.


반응형