execution_date
사전적으로 실행 날짜라는 의미인데 Airflow에서의 개념은 실제 실행 시점과는 관계가 없다.
Airflow에서 execution_date는 일종의 주문 번호(run id)이며, 그 값은 처리할 데이터의 시간 범위 중 가장 빠른 시점으로 결정된다.
예시를 들어 이해해보자.
예시
아래와 같이 매일 0시에 실행되고, 2021년 1월 1일을 기준으로 시작하는 test_dag가 있다고 하자.
DAG(
dag_id='test_dag',
schedule_interval='0 0 * * *',
start_date=datetime.datetime(2021, 1, 1)
)
2022.08.15 - [Airflow] 스케쥴링에서도 정리했지만 test_dag의 실행 시점과 데이터 처리 범위는 아래 표와 같다.
작업 실행 시점 | 데이터 처리 범위 |
2021/01/02 00:00:00 | 2021/01/01 00:00:00 ~ 2021/01/01 23:59:59 |
2021/01/03 00:00:00 | 2021/01/02 00:00:00 ~ 2021/01/02 23:59:59 |
2021/01/04 00:00:00 | 2021/01/03 00:00:00 ~ 2021/01/03 23:59:59 |
이때 각 작업의 execution_date는 데이터 처리 범위의 가장 빠른 시점인 2021/01/01 00:00:00, 2021/01/02 00:00:00, 2021/01/03 00:00:00이 된다.
작업 실행 시점 | 데이터 처리 범위 | execution_date |
2021/01/02 00:00:00 | 2021/01/01 00:00:00 ~ 2021/01/01 23:59:59 | 2021/01/01 00:00:00 |
2021/01/03 00:00:00 | 2021/01/02 00:00:00 ~ 2021/01/02 23:59:59 | 2021/01/02 00:00:00 |
2021/01/04 00:00:00 | 2021/01/03 00:00:00 ~ 2021/01/03 23:59:59 | 2021/01/03 00:00:00 |
그림으로 보면 아래와 같다.
의미
CLI 환경에서 run, test, backfill 등으로 DAG나 Task를 실행할 때 execution_date를 명시하지 않으면 실행되지 않는다.
usage: airflow test dag_id task_id execution_date
# 예시
airflow test test_dag print_hello 2022-08-22
예시는 test_dag의 print_hello를 2022-08-22이라는 날짜를 인자로 하여 실행하라는 뜻으로, Airflow에서 Task를 실제로 언제 실행하는지에는 관심이 없다.
Airflow가 execution_date를 요구하는 이유는 작업의 ID가 필요하기 때문이다. Airflow는 배치 처리에 적절하게 구성되어 있으며 동일한 작업을 정해진 시점에 정해진 시간 범위의 데이터를 가지고 반복해서 처리한다.
즉, execution_date는 dag run 인스턴스를 구분하는 ID가 되고
Task 인스턴스를 구분하는 ID가 된다.
그리고 dag run 인스턴스와 Task 인스턴스 간의 관계 기준이 된다.
참고 문서
https://oboki.net/workspace/data-engineering/airflow/airflow-execution_date-이해하기/
https://blog.bsk.im/2021/03/21/apache-airflow-aip-39/
https://it-sunny-333.tistory.com/157
blog.naver.com/gyrbsdl18/221561318823
https://stackoverflow.com/questions/39612488/airflow-trigger-dag-execution-date-is-the-next-day-why