Airflow에서 Backfill
은 이전에 실행되지 않은 작업을 재실행하는 프로세스이다.
만약 DAG가 매일 자정에 실행되도록 스케줄되어있고, 특정 기간 동안 실행되지 않았을 경우, Backfill
을 사용하여 그 기간동안 누락된 작업을 재실행할 수 있다.
success
로 표시되고, 실패한 작업은 failed
로 표시된다. 이를 통해 실행된 작업을 추적하고 모니터링할 수 있다.backfill이 모든 상황에 필요한 것은 아니다. DAG가 full refresh를 하고 있다면 backfill의 실행에 의미가 없기 때문이다. backfill이 필요한 경우는 execution_date를 사용해서 Incremental update가 구현되어 있어야 한다.
DAG의
full refresh
는 이전에 실행되었던 작업의 결과와 상태가 모두 삭제되고, DAG의 최신 데이터를 기반으로 처음부터 다시 데이터를 로드하는 과정이기 때문에, 이전에 실행되었던 작업의 결과를 복원하거나 특정 기간 동안의 작업을 역으로 실행하는 목적으로 사용되는 backfill은 굳이 필요가 없다.
backfill을 위해서는 Incremental update가 구현되어야 하고, 이를 위해서는 데이터 소스가 update할 시간, 날짜별로 구분이 되어야 한다.
예를들어 일자별 주식 데이터를 가지고 있는 stock_info
테이블이 있고, date(일자) 필드가 primary key라고 해보자. 매일 매일 오늘로부터 일주일간의 데이터를 가지고 온다고 가정했을 때, DAG가 실행될 때마다 6개의 중복 데이터가 생긴다. 이를 구분해주려면 실제로 그 데이터를 생성한 날짜, create_date
필드를 추가하여 최신으로 가져온 데이터를 남김으로써 중복된 데이터를 제거할 수 있다.
이렇게 데이터 소스에 create_date
필드를 추가하고 이를 활용함으로써 backfill을 할 수 있는 조건을 갖출 수 있다.
backfill을 위해서는 DAG를 설정할 때 catchup
필드를 True로 설정해두어야 한다. 또한 DAG 구현이
execution_date을 고려해야 하여 구현되어있어야 하고 멱등성(idempotent)을 가지고 있어야 한다.
멱등성
동일한 작업을 반복적으로 수행해도 결과가 동일한 특성을 의미한다. 즉, 한 번 이상 수행되더라도 결과가 변하지 않는 것이다. 멱등성은 backfill에서 뿐만아니라 데이터베이스, 네트워크 통신, 웹 서비스 등 다양한 분야에서 중요한 개념으로 활용된다. 예를 들어 RESTful API에서 HTTP 메서드 중 GET 메서드는 멱등한 특성을 가지고 있어 동일한 요청을 여러 번 수행해도 동일한 응답을 반환한다.
아래 커맨드는 backfill 명령어의 기본 구문으로, 여러 옵션을 추가하여 backfill 명령을 수행할 수 있다.
airflow backfill <dag_id> [-s START_DATE] [-e END_DATE] [-t TASK_REGEX] [--reset_dagruns] [--rerun_failed_tasks] [--ignore_first_depends_on_past] [--verbose]
<dag_id>
: backfill을 실행할 DAG Id이다.-s START_DATE
: backfill의 시작 날짜를 지정한다. 이렇게 해서 시작 날짜 이후에 실행되지 않은 작업이 재실행된다. 날짜 형식은 "YYYY-MM-DD"이며, 선택적으로 "YYYY-MM-DDTHH:MM:SS"까지 지정할 수 있다.-e END_DATE
: backfill의 종료 날짜를 지정한다. 종료 날짜까지의 작업이 재실행된다. start_date와 마찬가지로 날짜 형식은 "YYYY-MM-DD"이며, 선택적으로 "YYYY-MM-DDTHH:MM:SS"까지 지정할 수 있다.-t TASK_REGEX
: 특정 작업만 선택적으로 재실행하기 위한 정규 표현식이다.--reset_dagruns
: backfill 실행 전에 DAG의 모든 실행 상태를 초기화한다.--rerun_failed_tasks
: 실패한 작업을 재실행한다.--ignore_first_depends_on_past
: 처음 실행된 작업이depends_on_past
설정에 관계없이 실행되도록 한다. (depends_on_past
는 DAG를 정의할 때default_args
에서 설정할 수 있음)--verbose
: 상세한 출력 모드로 실행한다.
실제로 사용한다면 다음과 같이 사용할 수 있다. 여기서 주의할 점은 start_date
부터 시작하지만 end_date
은 포함하지 않는다.
# 2023-01-01 ~ 2023-01-20 까지의 DAG 재실행
airflow backfill my_dag -s 2023-01-01 -e 2023-01-20
backfill의 실행순서는 날짜/시간순이 아니고 랜덤으로 실행된다. 만일 날짜순으로 하고 싶다면 아래와 같이 DAG default_args의 depends_on_past
를 True로 설정해야한다.
with DAG(
dag_id = 'backfill_example',
start_date = datetime(2023,1,1),
...
default_args = {
'depends_on_past': True,
}