Airflow란 무엇이며 언제 어디에 왜 사용하는지에 대하여
들어가며
데이터 파이프라인을 구축하다 보면 다음과 같은 문제를 자주 마주칩니다:
- 여러 작업을 순차적으로 실행해야 할 때
- 주기적으로 실행되는 배치 작업을 관리해야 할 때
- 워크플로우의 상태를 모니터링하고 문제를 디버깅해야 할 때
- 다양한 도구와 시스템을 연결하는 파이프라인을 구성해야 할 때
Apache Airflow는 이러한 문제를 해결하기 위한 배치 워크플로우 오케스트레이션 플랫폼입니다1. Python 기반의 확장 가능한 프레임워크를 통해 거의 모든 기술과 연결할 수 있는 워크플로우를 구축할 수 있으며, 웹 기반 UI를 통해 워크플로우를 시각화하고 관리하며 디버깅할 수 있습니다.
Airflow란 무엇인가?
Apache Airflow는 배치 워크플로우를 개발, 스케줄링, 모니터링할 수 있는 오픈소스 플랫폼입니다. 단일 프로세스부터 대규모 워크로드를 처리할 수 있는 분산 시스템까지 다양한 구성으로 실행할 수 있습니다.
주요 특징
- Workflows as Code: 워크플로우를 Python 코드로 정의하여 버전 관리와 협업이 용이
- 확장 가능한 프레임워크: 다양한 내장 연산자와 커스텀 확장 지원
- 웹 기반 UI: 워크플로우 시각화, 관리, 디버깅을 위한 직관적인 인터페이스
- 유연한 배포: 노트북의 단일 프로세스부터 대규모 워크로드를 처리할 수 있는 분산 시스템까지 다양한 구성 지원
Workflows as Code
Airflow 워크플로우는 Python으로 작성하게 됩니다. 이 “Workflows as Code” 접근 방식은 다음과 같은 장점을 제공합니다:
- 동적 생성: 코드로 파이프라인을 정의하여 동적 DAG 생성과 파라미터화 가능
- 확장성: Airflow 프레임워크는 광범위한 내장 연산자를 포함하며 필요에 따라 확장 가능
- 유연성: Jinja 템플릿 엔진을 활용하여 풍부한 커스터마이징 가능
DAG (Directed Acyclic Graph)
DAG는 워크플로우 실행에 필요한 모든 것을 캡슐화하는 모델입니다. DAG의 주요 속성은 다음과 같습니다:
- Schedule: 워크플로우가 실행되어야 하는 시점
- Tasks: 워커에서 실행되는 개별 작업 단위
- Task Dependencies: 작업이 실행되는 순서와 조건
- Callbacks: 전체 워크플로우가 완료될 때 수행할 작업
간단한 DAG 예시
다음은 간단한 DAG를 정의하는 코드 예시입니다:
from datetime import datetime
from airflow.sdk import DAG, task
from airflow.providers.standard.operators.bash import BashOperator
# DAG는 워크플로우, 작업의 모음을 나타냅니다
with DAG(dag_id="demo", start_date=datetime(2024, 1, 1), schedule="0 0 * * *") as dag:
# 작업은 연산자로 표현됩니다
hello = BashOperator(task_id="hello", bash_command="echo hello")
@task()
def airflow():
print("airflow")
# 작업 간 의존성 설정
hello >> airflow()
이 예시에서 볼 수 있는 내용:
"demo"라는 이름의 DAG로, 2024년 1월 1일부터 매일 실행되도록 스케줄링됨- 두 개의 작업: 하나는 셸 스크립트를 실행하는
BashOperator를 사용하고, 다른 하나는@task데코레이터로 정의된 Python 함수 >>연산자는 두 작업 간의 의존성을 정의하고 실행 순서를 제어
Airflow는 스크립트를 파싱하고, 작업을 스케줄링하며, 정의된 순서로 실행합니다. "demo" DAG의 상태는 웹 인터페이스에 표시됩니다.
이 예시는 간단한 Bash 명령과 Python 함수를 사용하지만, Airflow 작업은 거의 모든 코드를 실행할 수 있습니다. Spark 작업 실행, 스토리지 버킷 간 파일 이동, 알림 이메일 전송 등에 사용할 수 있습니다.
참고: “DAG”라는 용어는 수학적 개념인 “directed acyclic graph(방향성 비순환 그래프)”에서 유래했지만, Airflow에서의 의미는 수학적 DAG 개념의 단순한 데이터 구조를 훨씬 넘어서 발전했습니다. 따라서 Airflow에서는 “Dag”라는 용어를 사용합니다.
왜 Airflow를 사용할까?
Airflow는 배치 워크플로우를 오케스트레이션하기 위한 플랫폼입니다. 광범위한 내장 연산자를 갖춘 유연한 프레임워크를 제공하며, 새로운 기술과의 통합이 쉽습니다.
명확한 시작과 끝이 있고 스케줄에 따라 실행되는 워크플로우가 있다면, Airflow DAG에 적합합니다.
코딩을 클릭보다 선호한다면, Airflow가 적합합니다. Python 코드로 워크플로우를 정의하면 다음과 같은 주요 이점을 얻을 수 있습니다:
- 버전 관리: 변경사항 추적, 이전 버전으로 롤백, 팀과의 협업 가능
- 팀 협업: 여러 개발자가 동일한 워크플로우 코드베이스에서 작업 가능
- 테스트: 단위 테스트와 통합 테스트를 통해 파이프라인 로직 검증 가능
- 확장성: 기존 컴포넌트의 대규모 생태계를 사용하여 워크플로우 커스터마이징 또는 자체 구축 가능
Airflow의 풍부한 스케줄링 및 실행 의미론을 통해 복잡하고 반복적인 파이프라인을 쉽게 정의할 수 있습니다. 웹 인터페이스에서 DAG를 수동으로 트리거하고, 로그를 검사하며, 작업 상태를 모니터링할 수 있습니다. 또한 과거 데이터를 처리하기 위해 DAG 실행을 백필하거나, 비용과 시간을 최소화하기 위해 실패한 작업만 다시 실행할 수 있습니다.
Airflow를 사용하기에 적합하지 않은 경우
Airflow는 유한한 배치 워크플로우를 위해 설계되었습니다. CLI나 REST API를 사용하여 DAG를 트리거할 수 있지만, Airflow는 지속적으로 실행되는 이벤트 기반 또는 스트리밍 워크로드를 위한 것이 아닙니다. 다만, Airflow는 종종 Apache Kafka와 같은 스트리밍 시스템을 보완합니다. Kafka는 실시간 수집을 처리하고 데이터를 스토리지에 기록합니다. 그런 다음 Airflow가 주기적으로 해당 데이터를 선택하여 배치로 처리할 수 있습니다.
코딩을 통해서 배치를 개발해야 하기 때문에 코딩을 피하고 싶은 분들이라면, Airflow를 통한 워크플로우 자동화가 적합하지 않을 수 있습니다.
런타임에 파이프라인이 변경될 수 있는 동적 파이프라인을 구성하면, Airflow 웹 UI에서는 가장 최근 실행 버전에 대한 정의만 표현하기 때문에 파이프라인 변경 이력을 확인하기 어려워집니다. 따라서 항상 일관된 고정 작업 이외에는 Airflow 구성에 적합하지 않습니다.
마무리
Apache Airflow를 효과적으로 활용하면:
- Workflows as Code: Python 코드로 워크플로우를 정의하여 버전 관리와 협업이 용이
- 유연한 스케줄링: 복잡하고 반복적인 파이프라인을 쉽게 정의
- 확장 가능한 프레임워크: 다양한 내장 연산자와 커스텀 확장 지원
- 웹 기반 모니터링: 직관적인 UI를 통해 워크플로우 상태 확인 및 디버깅
Airflow는 배치 워크플로우를 효율적으로 관리할 수 있는 강력한 플랫폼입니다. 대부분의 현업에서 워크플로우 자동화에 Airflow를 가장 먼저 검토하는 이유입니다.
참고 자료:
-
Apache Airflow 공식 문서 - Airflow의 전체 가이드와 개념 설명 ↩
댓글남기기