본문 바로가기
IT & 데이터 사이언스/Data Engineering

[Airflow] Apache Airflow 살펴보기

by 바른 호랑이 2024. 7. 15.
728x90
반응형

안녕하세요. 바른호랑이입니다.

이번 게시글에서는 Apache Airflow가 무엇인지에 대해 알아볼 예정입니다.

Apache Airflow는 일종의 WMS(Workflow Management System) 도구로 다양한 (분산) 시스템에서 발생하는 작업들을 조율하는 작업을 수행합니다. Airflow는 직접적으로 데이터 처리 작업을 수행하지는 않지만 데이터 처리를 위한 다양한 구성요소들을 조정하기에 데이터 프로세스 과정에서 중요한 역할을 수행한다고 할 수 있으며, 이에 대해서 이해하기 위해서는 우선 데이터 파이프라인이 무엇인지에 대해 알아야 합니다.

데이터 파이프라인은 간단하게 이야기하면 원하는 결과를 도출하기 위해 실행되는 여러 태스크 또는 동작들의 집합체로 일반적으로 ETL 또는 ELT의 로직을 예로 들 수 있습니다. 

 

1. 원천 소스에서 데이터를 추출(Extract)

2. 추출한 데이터를 정제 또는 변환(Transform)

3. 처리한 데이터를 적재(Load)

 

위와 같은 로직처럼 파이프라인은 여러 개의 서로 다른 태스크 또는 동작들로 구성되어 있으며, 상황에 맞게 정해진 순서대로 실행되어야 한다는 제한 조건이 있습니다. 실행 순서는 태스크 간의 의존성에 따라 결정되는데, 이를 명확하게 확인하기 위해서는 아래와 같이 그래프로 표현하는 방법을 사용할 수 있습니다.

방향성 비순환 그래프(DAG)의 예시

위와 같은 그래프처럼 방향성과 끝점(directed edged)이 포함되어 있으면서 반복이나 순환을 허용하지 않는 그래프를 방향성 비순환 그래프(Directed Acyclic Graph, DAG)라고 부르며, 그래프가 정상적으로 동작하기 위해서는 태스크 간의 순환 실행을 방지하는 비순환 속성이 전제가 되어야 합니다. 순환 실행은 순환 의존성 문제로 연결되어 결국 교착상태(Deadlock)로 이어지게 되기 때문에 그래프의 실행과 동작을 위해서는 반드시 지켜져야 합니다.

방향성 순환 그래프의 문제점

DAG는 파이프라인 실행을 위한 단순하고 명확한 알고리즘을 제공한다는 이점을 제공하며, 개념적으로 설명하면 다음과 같은 단계로 구성됩니다.

 

1. 그래프 안에 태스크는 각각 개방된(미완료된) 상태로 끝점을 통해 다음 태스크로 향하고, 다음 태스크로 향하기 전에 이전 태스크가 완료되었는지 확인합니다.

2. 실행 대기열의 태스크를 실행하고 오류 없이 태스크가 완료되면 완료 표시를 합니다.

3. 그래프의 모든 태스크가 완료될 때까지 1번과 2번을 반복합니다.

DAG의 태스크 실행 예시

위와 같은 그래프 파이프라인 표현은 태스크 간의 의존성을 직관적으로 설명해 준다는 이점을 가지지만, 파이프라인에 작성된 태스크가 많을 경우 한눈에 알아보기 어려울 수도 있습니다. 이를 해결하기 위해 공통적인 특징을 가지는 태스크들을 묶어서 더욱 간단하게 선형 체인(Linear chain)의 형태로 표현할 수도 있으며, 대표적인 예시로 날씨 데이터와 전력 데이터를 연계하여 머신러닝 모델을 훈련시키는 파이프라인을 아래와 같이 표현하는 것을 들 수 있습니다.

그래프 기반 파이프라인의 또 다른 특성으로는 하나의 모놀리식(monolithic) 스크립트 또는 프로세스로 구성되는 것이 아니라 다량의 점진적인 태스크로 명확하게 분리될 수 있다는 것으로, 파이프 라인의 중간 태스크가 실패할 경우 모놀리식 스크립트는 전체 스크립트를 재실행해야 하는 것과 달리 실패한 태스크와 그 이후 태스크만 재실행하면 되기에 보다 효율적으로 워크플로우를 구성할 수 있습니다.

의존성이 있는 그래프 태스크 실행에 대한 어려움은 오랫동안 이슈였던 것이기 때문에 이와 같은 문제를 해결하기 위해 다양한 Workflow Management 솔루션들이 개발되었고, 이와 같은 솔루션들은 태스크 그래프를 워크플로우 또는 파이프라인으로 정의하고 실행하는 것을 지원합니다. 대표적인 Worklfow Management System들은 아래와 같은 것들이 있습니다.

이름 시작회사 워크플로우
정의
개발
언어
스케줄
관리
백필 사용자
인터페이스
플랫폼
설치
수평
확장
Airflow Airbnb Python Python Yes Yes Yes Anywhere Yes
Argo Applatix YAML Go 3rd party   Yes Kubernetes Yes
Azkaban LinkedIn YAML Java Yes No Yes Anywhere  
Conductor Netflix JSON Java No   Yes Anywhere Yes
Luigi Soptify Python Python No Yes Yes Anywhere Yes
Make   Custom DSL C No No No Anywhere No
Metaflow Netflix Python Python No   No Anywhere Yes
Nifi NSA UI Java Yes No Yes Anywhere Yes
Oozie   XML Java Yes Yes Yes Hadoop Yes

*백필(Backfilling): 하나의 플로우를 특정 옵션(기간) 기준으로 다시 실행할 수 있는 기능으로 태스크가 특정 기간 동안 실패하거나 새로 만든 플로우로 과거 데이터를 적재하고 싶을 때 수행함.

 

이와 같은 Workflow 관리 도구들은 기본적으로 의존성 있는 다수 태스크가 포함된 파이프라인을 정의하고 실행하지만, Workflow정의 방식이 각각의 도구마다 다르다는 점과 Workflow 관리자가 제공하는 기능의 범위가 다르다는 점에서 차이를 보입니다.

Airflow는 위에서 설명한 WMS 도구들 중 하나로 파이프라인이나 Workflow 태스크를 DAG로 정의할 수 있고, Python 스크립트로 DAG의 구조를 설명하고 구성할 수 있습니다. 일반적으로 각 DAG 파일은 주어진 DAG에 대한 태스크 집합과 태스크 간의 의존성을 기술하고, Airflow는 DAG 구조를 식별하기 위해 코드를 파싱(parsing)합니다. 이외에도 DAG파일에는 Airflow의 실행 방법과 시간 등과 같은 추가 메타데이터가 포함될 수 있다는 특징이 있습니다.

Airflow 파이프라인 예시

Airflow DAG를 Python 코드로 정의하게 되면 프로그래밍 접근 방식이 DAG를 구성하는데 많은 유연성을 제공할 수 있다는 장점을 취할 수 있습니다. 또한 계속해서 외부 DB, 빅데이터 기술 및 클라우드 서비스를 포함한 다양한 시스템에서 태스크를 실행할 수 있도록 Airflow 확장 기능들이 개발됨에 따라 Airflow는 여러 시스템 간에 데이터 프로세스를 결합할 수 있는 복잡한 데이터 파이프라인을 구축할 수 있게 되었습니다.

DAG로 파이프라인 구조를 정의하고 나면, Airflow로 파이프라인의 실행 시간과 실행 주기를 정의할 수 있으며, 이를 통해 시간, 일, 주, 월, 연과 같은 기간으로 DAG를 실행하거나 Cron과 같은 표현식을 활용하여 보다 복잡한 스케줄링을 설정할 수 있습니다. Airflow의 DAG 실행 방법에 대해 확인하기 위해서는 Airflow DAG에 대한 개발과 실행 프로세스에 대한 이해가 선행되어야 하며, 개념적으로 나누어보면 아래와 같은 3가지 주요 구성요소로 나누어 볼 수 있습니다. 

 

- Airflow 스케줄러

: DAG를 분석하고 현재 시점에서 DAG의 스케줄이 지난 경우 Airflow Worker에 DAG의 태스크를 예약함.

- Airflow Worker

: 예약된 태스크를 선택하고 실행함.

- Airflow Web Server

: 스케줄러에서 분석한 DAG를 시각화하고 DAG의 실행과 결과를 확인할 수 있는 주요 인터페이스를 제공함.

Airflow 주요 구성 요소에 대한 개요(출처: https://www.altexsoft.com/blog/apache-airflow-pros-cons/)

Airflow는 DAG의 예약과 실행 기능 이외에도, DAG를 확인하고 실행 결과에 대해 모니터링이 가능한 웹 인터페이스를 제공하며, 로그인 후 기본 페이지에 접근하면, 최근 실행결과에 대한 요약과 다양한 DAG에 대한 내용을 확인할 수 있습니다. 기본적으로 Airflow는 태스크 실행 실패 시에 재시도를 할 수 있기 때문에 오류 발생 시에 태스크를 복구할 수 있으며, 재시도가 실패할 경우 실패했음을 기록하고 (사용자가 알림을 설정했을 경우) 실패를 통보합니다. 트리 뷰를 통해 실패한 태스크를 보고 로그를 확인할 수 있으므로 디버깅 또한 쉽게 할 수 있으며, 트리 뷰를 활용하여 개별 태스크 결과를 삭제하고 종속된 태스크를 모두 재실행하는 기능 또한 지원합니다.

Airflow는 DAG에 정의된 특정 시점에 트리거하는 것과 더불어 최종 시점과 예상되는 다음 스케줄 주기를 상세하게 알려주는 기능도 가지고 있는데, 이를 통해 각각의 주기로 나누고 각 주기별로 DAG를 실행할 수 있습니다. 이를 통해 데이터 파이프라인을 점진적으로 실행할 수 있도록 구성이 가능하며, 이는 효율적인 파이프라인 구축으로 이어집니다. 점진적인 파이프라인에서 각 DAG는 매번 전체 데이터 세트를 다시 처리할 필요 없이 해당 시간 슬롯(Delta data)에 대한 데이터만 처리하면 되기에, 대규모 데이터 세트를 처리해야 할 경우 기존 결과에 대한 태스크 전체를 다시 수행하는 것을 방지하여 시간과 비용을 절감할 수 있습니다. 스케줄 주기는 백필 개념과 결합하여 새로 생성한 DAG를 과거 시점 및 기간에 대해 실행시키는 것을 가능하게 해 주며, 이 기능을 통해 과거 특정 기간에 대해 DAG를 실행하여 새로운 데이터 세트를 생성 또는 백필할 수 있습니다. 

Airflow는 다양한 부분에 있어서 장점들이 있기에 무조건 도입(적용)하면 좋을 것 같지만, 아래와 같은 특징을 때문에 상황에 따라 적합할 수도 부적합할 수도 있기에 상황에 맞게 도입(적용) 여부를 결정하는 것이 필요합니다.

 

1. Python 코드를 이용해 파이프라인의 구현이 가능하므로 복잡한 커스텀 파이프라인을 만들 수 있음.

2. 다양한 유형의 DB, 클라우드 서비스 등과 통합할 수 있는 다양한 애드온이 존재하기에 쉽게 확장가능함.

3. 수많은 스케줄링 기법은 파이프라인을 정기적으로 실행하고 점진적(증분, incremental) 처리를 통해 전체 파이프라인을 재실행할 필요 없는 효율적인 파이프라인 구축이 가능함.

4. 백필 기능을 사용하면 과거 데이터를 손쉽게 재처리할 수 있기 때문에 코드 변경 후 재생성이 필요한 데이터 재처리가 쉬움.

5. Airflow의 웹 인터페이스는 파이프라인 실행 결과를 쉽게 모니터링하고 디버깅하는 것을 지원함.

6. 반복적이거나 배치 태스크를 실행하는 기능에 초점이 맞춰져 있으므로 스트리밍(실시간데이터 처리) workflow와 파이프라인에는 적합하지 않을 수 있음.

7. Airflow는 동적 태스크 구현을 지원하기는 하지만, 웹 인터페이스의 경우 DAG의 가장 최근 실행 버전에 대한 정의만 표현해 주기에 Airflow가 실행되는 동안 구조가 변경되지 않는 파이프라인에 더 적합함.

8. Python언어로 DAG를 구현하기에 Python 프로그래밍 능력을 특정 수준 이상으로 가지고 있어야 하며, 파이프라인의 규모가 커지면 복잡성도 증대되기에 장기적인 DAG 유지관리를 위해서는 초기 사용 시점부터 엄격한 관리가 필요함.

 

728x90
반응형

댓글