Apache Airflow - 복잡한 데이터 작업을 조율하는 오케스트라 지휘자 🎶
안녕하세요! 👋 데이터 엔지니어링, 머신러닝 파이프라인, ETL 작업 등등... 처리해야 할 작업 흐름이 점점 복잡해지고 있지 않나요? 🤯 마치 수많은 악기 연주자를 이끌어야 하는 오케스트라 지휘자처럼, 이 복잡한 작업들을 어떻게 조화롭게 관리하고 실행할 수 있을까요? 오늘은 바로 이 문제에 대한 멋진 해결책, Apache Airflow에 대해 쉽고 재미있게 알아보겠습니다!
등장 배경
과거에는 복잡한 작업들을 어떻게 처리했을까요? 🤔 아마 많은 분들이 쉘 스크립트(.sh
)를 잔뜩 만들어 크론탭(Crontab) 에 등록해서 사용했을 겁니다.
- 초기: 개별 스크립트를 작성하고, 리눅스의
cron
같은 스케줄러를 이용해 특정 시간에 실행되도록 설정했습니다. - 문제점:
- 작업 간의 의존성 관리 🔗 (A 작업이 끝나야 B 작업 실행)가 어려웠습니다.
- 특정 작업이 실패했을 때 ⛔️, 재시도하거나 원인을 파악하기 번거로웠습니다.
- 전체 작업 흐름을 한눈에 파악하기 힘들었고 😵💫, 스케줄링 변경도 유연하지 못했습니다.
- 로그 확인이나 진행 상황 모니터링이 분산되어 있어 관리가 어려웠죠.
이런 불편함 속에서 "작업 흐름을 코드로 정의하고, 똑똑하게 스케줄링하고, 관리도 편하게 할 수 없을까?" 하는 고민 끝에 Airbnb에서 Airflow가 탄생했습니다! 🎉 지금은 Apache 재단의 Top-Level 프로젝트로 전 세계 수많은 기업에서 활발하게 사용되고 있답니다.
Airflow가 해결하는 문제 (특징/용도)
Airflow는 앞서 말한 문제들을 멋지게 해결해 줍니다.
- 복잡한 워크플로우의 코드 기반 정의 및 관리:
- Python 코드로 워크플로우(DAG)를 명확하게 정의할 수 있습니다. 덕분에 버전 관리(Git 등)도 쉽고, 동적인 파이프라인 생성도 가능해요. 작업 간의 선후 관계, 병렬 처리 등을 쉽게 구현할 수 있습니다. 🐍
- 스마트한 스케줄링 및 실행:
- 단순히 정해진 시간에 실행하는 것을 넘어, 특정 조건 충족 시 실행, 외부 이벤트에 의한 트리거, 실패 시 자동 재시도 등 유연한 스케줄링 옵션을 제공합니다. 과거 데이터를 처리하기 위한 백필(Backfill) 기능도 강력하죠. 🗓️💨
- 직관적인 모니터링 및 관리:
- Web UI를 통해 워크플로우의 구조, 실행 상태, 로그 등을 시각적으로 한눈에 파악할 수 있습니다. ✅ 각 작업의 성공/실패 여부, 실행 시간 등을 쉽게 추적하고 문제가 생겼을 때 빠르게 대응할 수 있도록 도와줍니다. 📊
핵심 원리
Airflow의 핵심은 DAG(Directed Acyclic Graph, 방향성 비순환 그래프) 입니다. 이름은 좀 어렵지만, '작업들이 어떤 순서로 흘러가는지 정의한 것'이라고 생각하면 쉬워요.
Bash
# 간단한 DAG 시각화 예시 (텍스트 기반)
+-----------+ +-----------+
| Task A | ---> | Task B |
| (시작) | | (A 완료후) |
+-----------+ +-----------+
| |
| v
v +-----------+
+-----------+ | Task D |
| Task C | ---> | (B,C완료후)|
| (A 완료후) | +-----------+
+-----------+
- DAG: 전체 워크플로우의 청사진입니다. Python 파일(
.py
)로 정의하며, 언제 어떻게 실행될지 (스케줄) 등을 설정합니다. - Task: DAG를 구성하는 개별 작업 단위입니다. 위 그림의 Task A, B, C, D가 각각의 Task에 해당합니다.
- Operator: Task가 '무엇을' 할지 정의하는 템플릿입니다. 예를 들어,
BashOperator
: 쉘 명령어를 실행합니다.PythonOperator
: 파이썬 함수를 실행합니다.PostgresOperator
: PostgreSQL 쿼리를 실행합니다.- 이 외에도 수많은 종류의 Operator가 있어 다양한 시스템과 연동할 수 있습니다. 🛠️
작동 흐름 요약:
- Scheduler: 정의된 DAG 파일을 주기적으로 스캔하여 실행 시간이 된 DAG Run과 Task Instance를 찾아 실행 대기열(Queue)에 넣습니다.
- Executor: 어떤 방식으로 Task를 실행할지 결정합니다. (예: 로컬에서 순차 실행, Celery/Kubernetes를 이용한 분산 실행 등)
- Worker: Executor의 지시에 따라 실제 Task를 실행하는 주체입니다.
- Web Server: 사용자에게 UI를 제공하고, DAG 상태 확인, 수동 실행 등의 기능을 제공합니다.
- Metadata Database: DAG 정보, Task 상태, 실행 기록 등 모든 메타데이터를 저장하는 데이터베이스입니다. (보통 PostgreSQL이나 MySQL 사용)
구성 요소 | 역할 | 비유 |
DAG | 워크플로우 전체 구조 및 스케줄 정의 | 오케스트라 악보 |
Task | 워크플로우 내 개별 작업 단위 | 악보의 특정 파트 |
Operator | Task의 실제 행동을 정의하는 템플릿 | 악기 종류 (지시) |
Scheduler | 스케줄에 맞춰 Task를 실행 큐에 넣음 | 지휘자 (연주 시작!) |
Executor/Worker | Task를 실제로 실행 | 악기 연주자 |
Web Server | 사용자 인터페이스 제공 (모니터링, 관리) | 공연장 안내/관리자 |
Metadata DB | 모든 상태 정보 저장 (악보, 연주 기록 등) | 음악 라이브러리 |
주의사항 및 팁 💡
⚠️ 이것만은 주의하세요!
- 멱등성(Idempotency) 유지: Task는 여러 번 실행되어도 결과가 동일해야 합니다.
- 상세 설명: 네트워크 오류 등으로 Task가 중복 실행될 수 있습니다. 이때 결과가 달라지면 데이터 정합성에 문제가 생길 수 있습니다. 😱
- 해결 방법: 예를 들어, 데이터를 삽입하는 Task라면 단순히 INSERT 대신
INSERT ... ON CONFLICT DO NOTHING/UPDATE
(UPSERT) 구문을 사용하거나, 특정 파티션/날짜 데이터를 삭제 후 다시 삽입하는 방식으로 구현합니다.
- Task는 가볍게, 원자적으로: 하나의 Task가 너무 많은 일을 하거나 오래 걸리지 않도록 설계하세요.
- 상세 설명: Task가 너무 무거우면 실패 시 재시도 비용이 크고, 디버깅도 어려워집니다.
- 해결 방법: 큰 작업을 여러 개의 작은 Task로 나누고, 서로 의존성을 갖도록 DAG를 구성하세요.
- DAG 정의 파일은 가볍게: DAG 파일 자체에서 무거운 연산(DB 조회, API 호출 등)을 직접 수행하지 마세요.
- 상세 설명: Scheduler는 DAG 파일을 자주 파싱합니다. 이때 시간이 오래 걸리면 전체 Airflow 성능에 영향을 줄 수 있습니다. 🔥
- 해결 방법: 실제 작업 로직은 Operator 내부(예:
PythonOperator
의python_callable
함수)에서 실행되도록 하고, DAG 파일은 구조 정의에만 집중하세요.
💡 꿀팁
- Connections & Hooks: 외부 시스템(DB, 클라우드 서비스 등) 연동 정보는 Airflow UI의 Connection에 안전하게 저장하고, 코드에서는 Hook을 사용해 쉽게 연결 정보를 가져와 사용하세요. 보안 UP! ✨
- Variables & Macros: DAG 내에서 자주 사용되는 값(경로, 설정값 등)은 Variable로 관리하고, 실행 시간 등 동적인 값은 Jinja 템플릿과 Macro를 활용하면 유연성이 높아집니다. (예:
{{ ds }}
는 실행 날짜) - TaskGroups: 관련된 Task들을 시각적으로 그룹화하여 복잡한 DAG를 더 보기 쉽게 만들 수 있습니다. (Airflow 2.0 이상) 🎁
- SubDAGs (주의해서 사용): 재사용 가능한 Task 그룹을 만들 때 유용하지만, 데드락 등 잠재적 문제가 있어 TaskGroups 사용이 권장됩니다.
- Custom Operators: 필요한 기능의 Operator가 없다면 직접 만들어서 사용할 수도 있습니다! 💪
마치며
지금까지 Apache Airflow가 무엇이고, 왜 필요하며, 어떻게 작동하는지 알아보았습니다. 처음에는 DAG, Operator 같은 개념들이 조금 낯설 수 있지만, Python 코드로 복잡한 데이터 파이프라인을 체계적으로 관리할 수 있다는 점은 정말 매력적이죠? 😉 이 글이 여러분의 데이터 여정에 작은 도움이 되었기를 바랍니다! Airflow를 사용하시면서 궁금한 점이나 공유하고 싶은 팁이 있다면 언제든지 댓글로 남겨주세요! 🙋♀️
참고 자료 🔖
- Apache Airflow 공식 문서
- Apache Airflow 튜토리얼
- Astronomer - Airflow 가이드 (Managed Airflow 서비스 제공사, 양질의 가이드 제공)
#ApacheAirflow #Airflow #데이터파이프라인 #워크플로우관리 #데이터엔지니어링 #ETL #오케스트레이션