🪁 Airflow
- Airbnb에서 만든 workflow management tool이며, 현재는 아파치 재단에서 관리중인 오픈소스입니다.
- 데이터엔지니어링의 ETL 작업 자동화, DAG(Directed Acyclic Graph) 형태의 워크플로우 작성, 정교한 dependency의 파이프라인 설정 가능합니다.
- ETL(Extract, Transformation, Load)이란? 데이터를 추출하고 가공하여 적재하는 과정을 파이프라인으로 구축하고 주기적으로 실행하는 것입니다.
- 추출, 가공, 적재 기능을 나눠서 개발하고 Airflow로 작업들을 연결하여 파이프라인으로 배치하고 일정 시간마다 주기적으로 실행 가능합니다.
- 주기적으로 실행하는 것은 Linux CronTab과 유사하지만, CronTab은 하나의 애플리케이션만 지정 가능하고 각 태스크를 연결하는 것이 불가능합니다.
- 반면 Airflow는 복잡한 작업을 쉽게 구성할 수 있고, 각 태스크 별로 연결할 수 있어 전체 파이프라인 구성에 적합합니다.
- Airflow 2.0 이상부터는 Context Manager나 Decorator 등 개발자에게 친숙한 Python 문법을 사용해 DAG를 작성할 수 있습니다.
⚙️ Airflow 동작 원리
- Scheduler : 모든 DAG와 Task를 모니터링하고 실행 순서와 상태를 관리합니다. 실행해야할 Task를 스케줄링하여 Executor에 제출합니다.
- Executor : status가 queued인 Task를 확인하며 실제 어떤 리소스가 투입되어 실행이 될 것인지 결정합니다.
- Worker : 실제 Task를 실행하는 주체입니다.
- Web server : Airflow의 웹 UI 서버. 실행 중인 작업을 한 눈에 볼 수 있는 다양한 View 기능을 제공합니다.
- DAG : Directed Acyclic Graph. Python으로 작성된 워크플로우로, Task들의 dependency를 정의합니다.
- Database : Airflow에 존재하는 DAG와 Task들의 메타데이터를 저장합니다. 기본 설정은 SQLite입니다.
- Airflowg.cfg : configuration 설정 파일입니다. DAG 파일 위치, log 파일 저장 위치 등을 설정할 수 있습니다.
- Airflow는 개발자가 작성한 Python DAG를 읽고, 거기에 맞춰 Scheduler가 Task를 스케줄링하면, Worker가 Task를 가져가 실행합니다.
- Task의 실행상태는 Database에 저장되고, 사용자는 UI를 통해서 각 Task의 실행 상태, 성공 여부 등을 확인할 수 있습니다.
🔃 DAG (Directed Acyclic Graph)
- 실행하고 싶은 Task들의 관계와 dependency를 표현하고 있는 Task들의 모음입니다.
- 어떤 순서와 어떤 dependency로 실행할지, 어떤 스케줄로 실행할지 등의 정보를 가집니다.
🛠 Operator
각 Airflow DAG는 여러 Task로 이루어져있으며, operator나 sensor가 하나의 Task로 만들어집니다. Airflow는 기본적인 Task를 위해 다양한 operator를 제공합니다.
- BashOperator : bash command를 실행
- PythonOperator : Python 함수를 실행
- EmailOperator : Email을 발송
- MySqlOperator : sql 쿼리를 수행
- Sensor : 시간, 파일, db row, 등등을 기다리는 센서
- DockerOperator: Docker 컨테이너를 실행할 수 있는 Operator
Airflow에서 기본으로 제공하는 operator 외에도 커뮤니티에서 만들어진 operator 또한 사용할 수 있습니다.
🐳 Docker로 Airflow 구성하는 경우
- Docker를 사용하는 경우 docker-compose로 6개의 컨테이너를 한 번에 생성하여야 합니다.
- Airflow 이미지가 각각 Scheduler, Worker, Web Server, flower(환경 모니터링 앱) 컨테이너로 실행되어야 합니다.
- 설정 정보와 메타 정보를 저장할 PostgreSQL 컨테이너가 필요합니다.
- Scheduler에서 Worker로 메세지를 전달하는 메세지 브로커로서의 Redis 컨테이너가 필요합니다.
- Apache 공식 사이트와 Bitnami에서 docker-compose로 설정할 수 있는 예제를 제공합니다.
참고 링크