← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 4번째

Airflow 모듈 4/151 airflow-learn-04

로지컬 데이트와 파이프라인 테스트

Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation docs/Airflow/docs/tutorial/fundamentals.rst (후반부: 타임존 ~ Testing Your Pipeline)

이 모듈을 다 읽으면

  • 타임존 인식 Dag을 만들 때 pendulum을 권장하고 표준 라이브러리 timezone을 피하는 이유를 설명할 수 있다
  • logical date가 "태스크가 실제로 실행되는 시각"이 아니라 "Dag 실행에 이름을 붙이는 기준 시점"이라는 점을 설명할 수 있다
  • airflow tasks test와 airflow dags test의 차이(로컬 실행 범위, 상태 기록 여부)를 구분할 수 있다

작성한 첫 Dag을 실전에 배포하기 전에 검증하는 방법을 다룬다. 타임존 인식 Dag을 만들 때 pendulum을 권장하는 이유, Airflow의 핵심 개념인 logical date가 무엇을 의미하는지, 그리고 CLI로 스크립트 파싱부터 메타데이터 검증, 개별 태스크 테스트, 전체 Dag 실행 테스트까지 단계적으로 검증하는 방법을 소개한다.

타임존 인식 Dag 만들기

타임존을 인식하는(timezone-aware) Dag을 만드는 것은 간단하다 — 날짜를 다룰 때 `pendulum` 라이브러리로 타임존 정보를 가진 날짜를 사용하기만 하면 된다. Python 표준 라이브러리의 `timezone` 객체는 알려진 한계가 있으므로 사용을 피해야 한다. 즉 Dag의 `start_date`나 스케줄과 관련된 날짜 계산에는 stdlib의 datetime.timezone 대신 pendulum을 쓰는 것이 Airflow가 권장하는 방식이다.

핵심 포인트

  • 타임존 인식 Dag을 만들려면 표준 라이브러리 datetime.timezone이 아니라 pendulum으로 날짜를 다뤄야 한다
  • 표준 라이브러리 timezone에는 알려진 한계가 있어 Airflow 문서가 명시적으로 사용을 피하라고 권고한다

스크립트 파싱과 메타데이터 검증

파이프라인을 테스트할 준비가 되었다면, 먼저 스크립트가 문제없이 파싱되는지 확인해야 한다. ``tutorial.py``를 Dags 폴더에 저장했다면 다음처럼 직접 실행해볼 수 있다.

python ~/airflow/dags/tutorial.py

에러 없이 실행된다면 Dag이 올바르게 설정된 것이다. 다음으로 몇 가지 CLI 명령으로 스크립트를 더 검증해볼 수 있다.

# 데이터베이스 테이블 초기화
airflow db migrate

# 활성 Dag 목록 출력
airflow dags list

# "tutorial" Dag의 태스크 목록 출력
airflow tasks list tutorial

# "tutorial" Dag의 graphviz 표현 출력
airflow dags show tutorial

이 명령들은 실제로 태스크를 실행하지 않고, Dag이 Airflow에 의해 올바르게 인식되고 파싱되는지를 확인하는 용도다.

핵심 포인트

  • `python <dag파일>`로 스크립트가 에러 없이 파싱되는지 먼저 확인한다
  • `airflow dags list`, `airflow tasks list`, `airflow dags show`로 Dag/태스크 구조가 올바르게 인식됐는지 검증할 수 있다

logical date란 무엇인가

특정 논리적 날짜(logical date)에 대해 개별 태스크 인스턴스를 테스트할 수 있는데, 이는 스케줄러가 특정 날짜·시각에 대해 태스크를 실행하는 상황을 시뮬레이션하는 것이다. 여기서 중요한 점은, 스케줄러는 태스크를 특정 날짜와 시각을 "위해서(for)" 실행하는 것이지, 반드시 그 날짜·시각 "에(at)" 실행하는 것은 아니라는 사실이다.

logical date는 Dag 실행(Dag run)의 이름이 붙는 기준이 되는 타임스탬프다. 일반적으로 워크플로우가 처리하는 시간 구간의 "끝" 시점에 해당하거나, 수동으로 트리거된 경우에는 그 트리거 시점에 해당한다. Airflow는 이 logical date를 이용해 각 실행을 조직화하고 추적한다 — UI, 로그, 코드에서 특정 실행을 가리킬 때 바로 이 값을 기준으로 삼는다. UI나 API로 Dag을 트리거할 때는 직접 logical date를 지정해, 특정 시점을 "기준으로" 워크플로우를 실행시킬 수도 있다.

핵심 포인트

  • 스케줄러는 태스크를 특정 날짜를 "위해"(for) 실행하는 것이지, 반드시 그 시각 "에"(at) 실행하는 것이 아니다
  • logical date는 Dag 실행에 이름을 붙이는 기준 타임스탬프로, 보통 워크플로우가 다루는 기간의 끝 시점 또는 수동 트리거 시점을 나타낸다
  • UI/로그/코드 어디서든 특정 Dag 실행을 가리킬 때 logical date를 기준으로 하며, 트리거 시 직접 지정할 수도 있다

airflow tasks test vs airflow dags test

다음 명령으로 특정 태스크 인스턴스를 테스트할 수 있다.

# command layout: command subcommand [dag_id] [task_id] [(optional) date]

# print_date 테스트
airflow tasks test tutorial print_date 2015-06-01

# sleep 테스트
airflow tasks test tutorial sleep 2015-06-01

# templated 테스트 — 템플릿이 어떻게 렌더링되는지도 확인 가능
airflow tasks test tutorial templated 2015-06-01

``airflow tasks test``는 태스크 인스턴스를 로컬에서 실행하고 로그를 stdout으로 출력하며, 데이터베이스에 상태를 기록하지 않는다. 개별 태스크 인스턴스를 빠르게 확인해보는 용도로 유용하다.

반면 ``airflow dags test``는 Dag run 하나 전체를 로컬에서 실행한다. ``airflow tasks test``와 달리 실제 Dag run을 생성하고 메타데이터 데이터베이스에 태스크 상태를 기록하므로, 초기화된 데이터베이스와 Airflow가 Dags 폴더에서 정상적으로 직렬화(serialize)할 수 있는 Dag이 필요하다. 이는 전체 Dag을 통째로 테스트할 때 유용하며, 코드에서 프로그래밍적으로 테스트할 때는 ``dag.test()``를 사용할 수 있다.

핵심 포인트

  • `airflow tasks test`는 태스크 하나를 로컬에서 실행해 로그만 stdout에 출력하고, DB에 상태를 기록하지 않는다
  • `airflow dags test`(또는 dag.test())는 실제 Dag run을 만들고 메타데이터 DB에 상태를 기록하는, 전체 Dag에 대한 테스트다