Apache Airflow®란 무엇인가요?

Apache Airflow®란 무엇인가요?

Apache Airflow®가 무엇인지, 그리고 왜 워크플로우를 코드로 정의하는 방식이 중요한지 소개하는 문서예요. Airflow의 핵심 개념인 Dag와 Task가 어떻게 구성되는지 간단한 코드 예시와 함께 확인해 볼게요. Airflow가 어떤 작업에 잘 맞고 어떤 상황에서는 잘 맞지 않는지도 함께 살펴봐요.

출처: 문서

본문

Apache Airflow®란 무엇인가요?

Apache Airflow®는 워크플로우를 개발·스케줄링·모니터링하기 위한 오픈소스 플랫폼이에요. 전통적인 시간 기반이나 이벤트 트리거 방식의 배치 데이터 파이프라인, 머신러닝, 모델 학습, 그리고 agentic이나 LLM 기반 워크로드까지 폭넓게 다룰 수 있어요. Airflow의 확장 가능한 Python 프레임워크 덕분에 사실상 어떤 기술과도 연결되는 워크플로우를 만들 수 있고, AI·agentic 도구를 파이프라인과 함께 오케스트레이션하는 provider도 점점 늘어나고 있어요. 웹 기반 UI를 통해 워크플로우를 시각화하고 관리하고 디버깅할 수 있죠. Airflow는 노트북의 단일 프로세스부터 대규모 워크로드를 감당하는 분산 시스템까지 다양한 구성으로 실행할 수 있어요.

워크플로우를 코드로 (Workflows as code)

Airflow 워크플로우는 전적으로 Python으로 정의돼요. 이렇게 "워크플로우를 코드로" 접근하는 방식은 몇 가지 장점을 가져다줘요:

  • 동적 (Dynamic): 파이프라인을 코드로 정의하므로 Dag를 동적으로 생성하고 매개변수화할 수 있어요.

  • 확장 가능 (Extensible): Airflow 프레임워크에는 다양한 내장 operator가 포함되어 있고, 필요에 맞게 확장할 수 있어요.

  • 유연함 (Flexible): Airflow는 Jinja 템플릿 엔진을 활용해서 풍부한 커스터마이징이 가능해요.

Task SDK

Airflow Task SDK에 대해서는 전용 참조 및 튜토리얼 사이트를 확인해 보세요:

Apache Airflow Task SDK

Dags

Dag는 워크플로우를 실행하는 데 필요한 모든 것을 담는 모델이에요. 몇 가지 Dag 속성을 살펴볼게요:

  • 스케줄 (Schedule): 워크플로우가 언제 실행되어야 하는지.
  • 태스크 (Tasks): 워커에서 실행되는 개별 작업 단위인 tasks.
  • 태스크 의존성 (Task Dependencies): tasks가 실행되는 순서와 조건.
  • 콜백 (Callbacks): 전체 워크플로우가 완료됐을 때 취할 동작.
  • 추가 파라미터 (Additional Parameters): 그 외 여러 운영 세부 사항.

간단한 Dag를 정의하는 코드 조각을 함께 볼게요:

from datetime import datetime

from airflow.sdk import DAG, task
from airflow.providers.standard.operators.bash import BashOperator

# A Dag represents a workflow, a collection of tasks
with DAG(dag_id="demo", start_date=datetime(2022, 1, 1), schedule="0 0 * * *"):
    # Tasks can be defined by instantiating operators
    hello = BashOperator(task_id="hello", bash_command="echo hello")

    # Tasks can be also defined with decorators (Airflow Taskflow syntax)
    @task.bash
    def airflow():
        return "echo airflow"

    @task
    def world():
        print("world")

    # Set dependencies between tasks
    hello >> airflow() >> world()

여기서 확인할 수 있는 것들이에요:

  • "demo"라는 이름의 Dag로, 2022년 1월 1일부터 매일 실행되도록 스케줄되어 있어요. Dag는 Airflow에서 워크플로우를 나타내는 방식이에요.
  • 셸 스크립트를 실행하는 두 개의 Bash 태스크: 하나는 BashOperator를, 다른 하나는 @task.bash 데코레이터를 사용해요.
  • Python 함수를 실행하는 하나의 Python 태스크: @task 데코레이터를 사용해요.
  • >> 연산자는 두 태스크 사이의 의존성을 정의하고 실행 순서를 제어해요.

Airflow는 스크립트를 파싱하고, 태스크를 스케줄링하며, 정의된 순서대로 실행해요. "demo" Dag의 상태는 웹 인터페이스에 표시돼요:

이 예시는 단순한 Bash 명령과 Python 함수를 사용하지만, Airflow 태스크는 사실상 어떤 코드도 실행할 수 있어요. Spark 작업을 실행하거나, 스토리지 버킷 사이에서 파일을 옮기거나, 알림 이메일을 보내는 데 태스크를 사용할 수 있어요. 같은 Dag가 시간이 지나며 여러 번 실행되는 모습은 위와 같아요.

그리드의 각 열은 개별 Dag 실행을 나타내요. graph 뷰와 grid 뷰가 가장 흔히 쓰이지만, Airflow는 워크플로우를 모니터링하고 트러블슈팅하기 위한 여러 뷰를 제공해요 — 예를 들어 Dag Overview 뷰 같은 거예요:

참고 (Note)

"DAG"라는 용어는 수학적 개념인 "directed acyclic graph(방향성 비순환 그래프)"에서 유래했지만, Airflow에서의 의미는 수학적 DAG 개념의 데이터 구조 그 이상으로 발전했어요. 그래서 Airflow에서는 Dag라는 용어를 쓰기로 결정했어요.

왜 Airflow®인가요?

Airflow는 배치 워크플로우를 오케스트레이션하기 위한 플랫폼이에요. 다양한 내장 operator를 갖춘 유연한 프레임워크를 제공하고, 새로운 기술과의 통합도 쉬워요.

워크플로우에 명확한 시작과 끝이 있고 스케줄에 따라 실행된다면 Airflow Dag에 아주 잘 맞아요.

클릭보다 코딩을 선호한다면 Airflow가 딱 맞을 거예요. 워크플로우를 Python 코드로 정의하면 몇 가지 핵심 이점이 생겨요:

  • 버전 관리 (Version control): 변경 사항을 추적하고 이전 버전으로 롤백하며 팀과 협업할 수 있어요.
  • 팀 협업 (Team collaboration): 여러 개발자가 같은 워크플로우 코드베이스에서 작업할 수 있어요.
  • 테스트 (Testing): 단위·통합 테스트를 통해 파이프라인 로직을 검증할 수 있어요.
  • 확장성 (Extensibility): 방대한 기존 컴포넌트 생태계로 워크플로우를 커스터마이징하거나 직접 만들 수 있어요.

Airflow의 풍부한 스케줄링·실행 시맨틱 덕분에 복잡하고 반복적인 파이프라인을 쉽게 정의할 수 있어요. 웹 인터페이스에서 Dag를 수동으로 트리거하고, 로그를 확인하고, 태스크 상태를 모니터링할 수 있어요. 또한 과거 데이터를 처리하기 위해 Dag 실행을 backfill하거나, 비용과 시간을 아끼기 위해 실패한 태스크만 다시 실행할 수도 있어요.

Airflow 플랫폼은 매우 커스터마이징 가능해요. Public Interface for Airflow 3.0+를 사용하면 operator부터 UI 플러그인, 실행 로직까지 시스템의 거의 모든 부분을 확장하고 조정할 수 있어요.

Airflow는 오픈소스이기 때문에 전 세계 커뮤니티가 개발·테스트·유지보수한 컴포넌트 위에 구축하게 돼요. 블로그 포스트, 책, 컨퍼런스 발표 등 풍부한 학습 자료를 찾을 수 있고, community, Slack, 메일링 리스트를 통해 다른 사람들과 소통할 수도 있어요.

왜 Airflow®가 아닌가요?

클릭을 코딩보다 선호한다면 Airflow가 최선의 선택이 아닐 수 있어요. 웹 UI가 워크플로우 관리를 단순화하고 개발자 경험도 계속 개선되고 있지만, 워크플로우를 코드로 정의하는 건 Airflow가 동작하는 핵심 방식이라 어느 정도 코딩은 항상 필요해요.

더 알아보기 (Learn more)