Airflow에서 Backfill 실행해보기

ohyujeong·2023년 6월 10일
1

Airflow

목록 보기
5/6

Backfill

Airflow에서 Backfill 은 이전에 실행되지 않은 작업을 재실행하는 프로세스이다.
만약 DAG가 매일 자정에 실행되도록 스케줄되어있고, 특정 기간 동안 실행되지 않았을 경우, Backfill 을 사용하여 그 기간동안 누락된 작업을 재실행할 수 있다.

특징

  • 시작 날짜 및 종료 날짜 지정 : backfill을 실행할 때 시작 날짜와 종료 날짜를 지정하여 특정 기간 동안의 작업을 재실행할 수 있다.
  • 의존성 해결: backfill을 실행할 때 의존성을 고려하여 DAG 내의 작업을 올바른 순서로 실행한다. 이전에 실행되지 않은 작업을 재실행하면서 DAG의 의존성을 준수한다.
  • 상태 업데이트: backfill이 실행되면 작업의 상태가 업데이트된다. 실행된 작업은 success 로 표시되고, 실패한 작업은 failed 로 표시된다. 이를 통해 실행된 작업을 추적하고 모니터링할 수 있다.

Backfill 실행의 조건

Incremental Update 방식

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을 할 수 있는 조건을 갖출 수 있다.

DAG 설정

backfill을 위해서는 DAG를 설정할 때 catchup 필드를 True로 설정해두어야 한다. 또한 DAG 구현이
execution_date을 고려해야 하여 구현되어있어야 하고 멱등성(idempotent)을 가지고 있어야 한다.

멱등성

동일한 작업을 반복적으로 수행해도 결과가 동일한 특성을 의미한다. 즉, 한 번 이상 수행되더라도 결과가 변하지 않는 것이다. 멱등성은 backfill에서 뿐만아니라 데이터베이스, 네트워크 통신, 웹 서비스 등 다양한 분야에서 중요한 개념으로 활용된다. 예를 들어 RESTful API에서 HTTP 메서드 중 GET 메서드는 멱등한 특성을 가지고 있어 동일한 요청을 여러 번 수행해도 동일한 응답을 반환한다.

커맨드라인에서 Backfill 실행하기

아래 커맨드는 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,
    }
profile
거친 돌이 다듬어져 조각이 되듯

0개의 댓글