Data Engineering/airflow

airflow에서 start_time, execution_time, backfill, catchup

히또아빠 2023. 8. 4. 11:44

1.airflow의 시간

https://airflow.apache.org/docs/apache-airflow/stable/faq.html#what-s-the-deal-with-start-date: start_date, execution_date 공식문서

1-1.start_date

실행 날짜가 아니라 스케줄 시작 시간으로 DAG 첫 실행은 'start_date + 실행주기' 에 실행하게 된다.

  • start_date: 2023-08-01 00:00:00
    • hourly job: schedule: 0 * * * * (매시 0분에 실행) → DAG의 첫 실행은 2023-08-01 01:00:00
    • daily job: schedule: 0 10 * * * (매일 10시 0분에 실행) → DAG의 첫 실행은 2023-08-02 10:00:00

1-2.execution_date

2023-08-01 하루 데이터를 사용하기 위해선 2023-08-01 00:00:00 ~ 2023-08-02 00:00:00 데이터를 집계. 8월 1일 데이터를 집계하는 것으로 left-bound. airflow의 Execution Date는 현재 수행하는 날짜로 부터 left-bound된 값이 제공 됨.

  • 고유 실행 ID(run id)
  • start_date: 2023-08-01 00:00:00인 daily job
    • 2023-08-02에 실행되는 task의 execution_date: 2023-08-01 00:00:00
    • 2023-08-03에 실행되는 task의 execution_date: 2023-08-02 00:00:00
    • 2023-08-04에 실행되는 task의 execution_date: 2023-08-03 00:00:00

1-3.Catch Up & Backfill

https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/dag-run.html#catchup : catch up, backfill 공식문서

1) Catch Up

아래 DAG의 start_date는 2023-08-01 daily 배치로 돌아간다. 해당 DAG를 현재시간(2023-08-04) 기준으로 등록하게 되면 과거의 2023-08-02 ~ 2023-08-04 총 3번의 task가 실행.

  • catchup=True 가 default로 False로 지정시 airflow 스케쥴러는 가장 최근의 interval DAG만 실행한다.
  • 과거 특정 시점부터 데이터 적재가 필요한 경우 start_date를 잘 설정하면 자동으로 과거 데이터 부터 적재 가능.
dag = DAG(
    "tutorial",
    default_args={
        "depends_on_past": True,
        "retries": 1,
        "retry_delay": datetime.timedelta(minutes=3),
    },
    start_date=pendulum.datetime(2023, 8, 1, tz = "Asia/Seoul"),
    description= "A simple tutorial DAG",
    schedule= 0 0 * * *,
    catchup=True,
)

2) Backfill

DAG의 catchup 옵션 값에 관계없이 DAG의 시작 날짜 이전에 데이터를 처리하기 원할때 backfill 명령어를 통해 실행 가능하며 기간설정으로 DAG 재시작.

# 지정한 기간동안 backfill 수행하지 않을 날짜만 수행
airflow dags backfill --start-date {date} --end-date {date} dag_id
# 지정한 기간동안 backfill 모든 재실행
airflow dags backfill --start-date {date} --end-date {date} --reset-dagruns dag_id
# 지정한 기간동안 실패한 task들만 재실행
airflow dags backfill --start-date {date} --end-date {date} --rerun-failed-tasks
300x250
반응형