2025년 4월 22일, Apache Airflow의 역사상 가장 중요한 릴리스인 Airflow 3.0.0이 공식 출시되었습니다. 이번 릴리스는 2020년 12월에 출시된 Airflow 2.0 이후 4년 만의 메이저 업데이트로, 서비스 지향 아키텍처, 안정적인 DAG 작성 인터페이스, 이벤트 기반 및 ML 워크플로우에 대한 확장된 지원, 그리고 React 기반의 완전히 새로워진 UI를 제공합니다.
현재 3천만 명 이상의 월간 다운로드(2020년 대비 30배 증가)와 8만 개 이상의 조직(2020년 2.5만 개에서 증가)에서 Airflow를 사용하고 있으며, ETL, ELT 및 Reverse ETL과 같은 초기 사용 사례를 넘어 30% 이상의 사용자가 MLOps에, 10%가 GenAI 워크플로우에 Airflow를 활용하고 있습니다.
Airflow 3.0의 가장 핵심적인 변화는 아키텍처의 근본적인 변화입니다. 이전 버전들과 비교했을 때 다음과 같은 주요 아키텍처 변경점이 있습니다:
Airflow 3.0은 태스크를 원격으로 실행할 수 있는 Task Execution API를 도입했습니다. 이 API는 태스크 실행을 스케줄러와 분리하고, Airflow의 전통적인 런타임 환경 외부에서 태스크를 실행하기 위한 안정적인 계약을 제공합니다.
이를 지원하기 위해 Airflow는 Task SDK를 도입했습니다. 이는 컨테이너, 엣지 환경 또는 다른 런타임과 같은 외부 시스템에서 Airflow 태스크를 실행하기 위한 경량 런타임 환경입니다. 이는 언어에 구애받지 않는 태스크 실행을 위한 기반을 마련하고, Airflow 기반 워크플로우에 개선된 격리, 이식성 및 확장성을 제공합니다.
Airflow 3.0은 또한 DAG 및 태스크를 정의하기 위한 핵심 작성 인터페이스를 노출하는 새로운 airflow.sdk
네임스페이스를 도입했습니다. DAG 작성자는 이제 내부 모듈이 아닌 airflow.sdk
에서 DAG
, @dag
, @task
와 같은 객체를 가져와야 합니다.
Airflow 3.0은 Edge Executor를 일반적으로 사용 가능한 기능으로 도입하여 분산되거나 원격 컴퓨팅 환경에서 태스크 실행을 가능하게 합니다. 이벤트 기반 및 엣지 컴퓨팅 사용 사례를 위해 설계된 Edge Executor는 Task Execution API와 통합되어 전통적인 Airflow 런타임을 넘어선 태스크 오케스트레이션을 지원합니다. 이 발전은 하이브리드 및 크로스 환경 오케스트레이션 패턴을 촉진하여 태스크 워커가 데이터 또는 애플리케이션 계층에 더 가깝게 작동할 수 있게 합니다.
Airflow 3.0은 이제 DAG를 파싱하기 위해 독립 DAG 프로세서를 필요로 합니다. 이 전용 프로세스는 스케줄러 성능, 격리 및 관찰 가능성을 향상시킵니다. 또한 DAG 파싱을 스케줄링 로직과 명확하게 분리함으로써 아키텍처를 단순화합니다.
Airflow 3.0은 DAG 작성 방법에 큰 변화를 가져왔습니다. 다음과 같은 주요 변경사항이 있습니다:
Airflow 3.0에서는 모든 DAG 작성자가 airflow.sdk
네임스페이스를 사용하여 코어 DAG 구성 요소를 가져와야 합니다. 기존의 방식은 다음과 같이 변경되었습니다:
Copy# 이전 방식 (2.x)
from airflow import DAG
from airflow.operators.python import PythonOperator
# 새로운 방식 (3.0)
from airflow.sdk import DAG, task
@task
def my_task():
return "Hello World"
with DAG(dag_id="example_dag", schedule="@daily"):
my_task()
Airflow 3.0은 레거시 schedule_interval
및 timetable
파라미터를 제거했습니다. DAG는 이제 모든 시간 및 이벤트 기반 스케줄링 로직에 대해 통합된 schedule
필드를 사용해야 합니다. 이는 DAG 정의를 단순화하고, 스케줄링 패러다임 전반에 걸쳐 일관성을 향상시킵니다.
Airflow 3.0은 여러 핵심 연산자, 센서 및 훅을 새로운 apache-airflow-providers-standard
패키지로 마이그레이션했습니다. 이 패키지에는 다음과 같은 일반적으로 사용되는 구성 요소가 포함됩니다:
PythonOperator
BashOperator
EmailOperator
SimpleHttpOperator
ShortCircuitOperator
이러한 연산자는 이전에 airflow-core
내에 번들로 제공되었지만 이제는 모듈성, 테스트 가능성 및 라이프사이클 독립성을 향상시키기 위해 프로바이더가 관리하는 구성 요소로 취급됩니다.
Airflow 3.0은 네이티브 DAG 버전 관리를 도입했습니다. DAG 구조 변경(예: 태스크 이름 변경, 의존성 변경)은 이제 메타데이터 데이터베이스에 직접 추적됩니다. 이를 통해 사용자는 UI 및 API를 통해 히스토리컬 DAG 구조를 검사할 수 있으며, 더 안전한 백필, 향상된 관찰성 및 런타임 결정 DAG 로직을 위한 기반을 마련합니다.
주요 이점:
백필은 이제 스케줄러에 의해 완전히 관리되며, 별도의 명령행 작업으로 실행되지 않습니다. 이 변경은 백필 로직을 일반 DAG 실행과 통합하고, 백필 실행이 다른 DAG 실행과 동일한 스케줄링, 버전 관리 및 관찰성 모델을 따르도록 합니다.
Airflow 3.0은 또한 백필을 시작하고 모니터링하기 위한 네이티브 UI 및 REST API 지원을 도입하여 백필을 더 접근하기 쉽고 자동화된 워크플로우에 쉽게 통합할 수 있게 합니다. 이러한 개선 사항은 더 스마트하고 안전한 히스토리컬 리프로세싱을 위한 기초를 마련합니다.
Airflow 3.0에서는 Dataset 개념이 Asset으로 이름이 변경되고, 현대 데이터 에코시스템의 일반적인 관행과 용어가 통일되었습니다. 내부 모델도 향후 자산 파티션 및 검증과 같은 기능을 더 잘 지원하도록 재작업되었습니다.
새로운 @asset
데코레이터와 DAG 파서의 관련 변경 사항을 통해 더 명확한 자산 중심의 DAG 정의가 가능하여, Airflow가 이벤트 기반 및 데이터 인식 스케줄링 패턴을 더 자연스럽게 지원할 수 있게 합니다.
Copy# Asset 기반 DAG의 예
from airflow.sdk import asset
@asset(schedule="@daily")
def extracted_data():
return {"a": 1, "b": 2}
@asset(schedule=extracted_data) # 이전 asset의 완료에 기반한 스케줄링
def transformed_data(context):
data = context["ti"].xcom_pull(
dag_id="extracted_data",
task_ids="extracted_data",
key="return_value",
include_prior_dates=True,
)
return {k: v * 2 for k, v in data.items()}
Airflow 3.0은 각 DAG 실행이 고유한 데이터 간격에 해당해야 한다는 제약을 제거함으로써 표현할 수 있는 DAG 유형을 확장합니다. AIP-83에서 도입된 이 변경 사항을 통해 고정된 일정에 작동하지 않는 워크플로우(예: 모델 훈련, 하이퍼파라미터 튜닝 및 추론 태스크)를 지원합니다.
이러한 ML 및 AI 지향 DAG는 종종 임시로 실행되거나, 외부 시스템에 의해 트리거되거나, 동일한 데이터셋에 대해 다른 매개변수로 여러 번 실행해야 합니다. logical_date=None
으로 여러 DAG 실행을 허용함으로써, Airflow는 이제 이러한 시나리오를 기본적으로 지원합니다.
Airflow 3.0은 React와 FastAPI를 기반으로 완전히 새롭게 디자인된 사용자 인터페이스를 제공합니다. 이 현대적인 아키텍처는 반응성을 향상시키고, 뷰 간 더 일관된 탐색을 가능하게 하며, DAG 버전 관리, 자산 중심 DAG 정의, 더 직관적인 필터링 및 검색을 포함한 새로운 UI 기능을 제공합니다.
새로운 UI의 주요 개선 사항:
Airflow 홈 페이지는 이제 환경에 대한 고수준 운영 개요를 제공합니다. 여기에는 핵심 구성 요소(스케줄러, 트리거, DAG 프로세서)에 대한 헬스 체크, DAG 및 태스크 인스턴스 상태에 대한 요약 통계, 그리고 자산 트리거 이벤트의 실시간 피드가 포함됩니다.
DAG 리스트 페이지는 더 깔끔한 레이아웃과 향상된 응답성으로 새롭게 구성되었습니다. 사용자는 이름, 태그 또는 소유자별로 DAG를 탐색할 수 있습니다.
그래프 및 그리드 뷰는 이제 런타임에 사용된 DAG 버전의 맥락에서 태스크 정보를 표시합니다. 이는 시간이 지남에 따라 진화하는 DAG에 대한 추적성을 향상시키고 히스토리컬 실행에 대한 더 정확한 디버깅을 제공합니다.
그래프 뷰는 이제 DAG 경계 전반에 걸쳐 소비되거나 생성된 자산을 포함하여 자산 및 태스크 의존성의 전체 체인을 시각화하는 것을 지원합니다.
Airflow 3.0에서는 많은 오래된 기능, 모듈 및 인터페이스가 제거되었습니다. 주요 제거 사항은 다음과 같습니다:
SubDagOperator
를 포함한 SubDAG 지원이 완전히 제거되었습니다. 중첩된 DAG 구조를 위해서는 TaskGroup을 사용하는 것이 권장됩니다.DeadlineAlerts
라는 더 유연한 대체 메커니즘이 계획되어 있습니다.conf
, execution_date
, dag_run.external_trigger
와 같은 여러 컨텍스트 변수가 태스크 실행 컨텍스트에서 제거되었습니다.logical_date=None
으로 수행됩니다.catchup_by_default
는 이제 False
로 기본 설정되며, create_cron_data_intervals
도 False
로 기본 설정됩니다.Airflow 3으로의 업그레이드를 지원하기 위해 다음과 같은 마이그레이션 도구가 제공됩니다:
Airflow 3.0으로 업그레이드하려면 Airflow 2.7 이상을 실행해야 합니다.
Airflow 3.0은 다음 Python 버전을 지원합니다:
Airflow에는 이제 Airflow 3.0과 더 이상 호환되지 않는 DAG 패턴 및 인터페이스를 감지하기 위한 Ruff 기반 린터가 포함되어 있습니다. 이러한 체크는 AIR30x
규칙 시리즈 아래에 패키지되어 있습니다:
Copyruff check dags/ --select AIR301
ruff check dags/ --select AIR301 --fix
Airflow 3.0은 Airflow 구성 파일을 검증하고 업그레이드하기 위한 새로운 유틸리티를 도입합니다:
Copyairflow config update
airflow config update --fix
Airflow 3.0은 2.0 릴리스 이후 가장 큰 변화를 가져왔으며, 아키텍처, 새로운 실행 모델, DAG 작성 및 스케줄링 개선 등 중요한 변화를 담고 있습니다. 이러한 변화는 현대 데이터 파이프라인의 요구사항에 맞춰 Airflow를 더욱 강력하고 유연하게 발전시켰습니다.
단순한 업그레이드를 넘어 Airflow 3.0은 데이터 오케스트레이션의 미래를 위한 기반을 마련했습니다. 향후 몇 년 동안 더 확장 가능하고, 이벤트 기반이며, 언어에 구애받지 않는 오케스트레이션을 위한 무대를 마련했습니다.
참고 자료: