본문 바로가기

DevOps/#Continuous Testing

[Data Pipeline] Apache Airflow 기반의 데이터 파이프라인 (1)

목차

1. Apache Airflow 살펴보기

데이터 파이프라인 소개

일반적인 데이터 파이프라인은 원하는 결과를 얻기 위해 실행되는 여러 태스크 또는 동작으로 구성된다.

예를 들어, 다음 주 날씨를 알려주는 쇼핑몰의 날씨 대시보드를 구축하는 시퀀스에서, 다음의 태스크가 수행되어야 한다.

  1. 다른 시스템의 날씨 API를 통해 일기 예보 데이터를 가져온다.
  2. 서비스 목적에 맞도록 데이터를 정제하거나 변환(ex. 온도를 화씨에서 섭씨로 변환) 한다.
  3. 변환된 데이터를 날씨 대시보드로 전송한다.

위의 3가지 서로 다른 태스크는 프로세스 실행 시 정해진 순서대로 진행되어야 한다.

데이터 파이프라인 그래프

태스크 간 의존성을 명확하게 확인하기 위해 데이터 파이프라인을 그래프로 표현할 수 있다. 태스크는 노드로, 태스크 간 의존성은 노드 간 방향으로 표시할 수 있어, 방향성 그래프(directed graph)라고도 한다.

위 날씨 대시보드를 위한 데이터 파이프라인 그래프는 방향성 비순환 그래프 (Directed Acycli Graph, DAG)라고 부른다. 이는 방향성의 끝점(Directed Edge)를 포함하되 반복이나 순환을 허용하지 않는다. (비순환, Acyclic) 이러한 속성은 태스크 간 순환 실행을 방지하기 때문에 태스크 간 상호 의존성으로 인한 논리적 오류(Deadlock)인 교착 상태로 이어질 가능성을 없앤다. 

파이프라인 그래프 실행

DAG는 파이프라인 실행을 위한 단순한 알고리즘을 제공한다는 장점을 갖는다. 알고리즘을 개념적으로 설명하면, 다음 단계로 구성된다.

  1. 그래프 안에 태스크는 각각 개방된(Open) 상태이며(==미완료) 다음 단계를 수행한다.
    1. 각각의 화살표 끝점은 태스크를 향하며 다음 태스크로 향하기 전에는 이전 태스크가 완료되었는지 확인합니다. (1단계)
    2. 태스크가 완료되면 다음에 실행해야 할 태스크를 대기열에 추가합니다.
  2. 실행 대기열에 있는 태스크를 실행하고 태스크 수행이 완료되면 완료 표시를 합니다.
  3. 그래프의 모든 태스크가 완료될 때까지 1단계로 돌아갑니다.

위 단계에 대해 대시보드 파이프라인 실행 정보를 추적함으로써 업스트림 의존성이 해결되었는지 확인하고 이후 태스크를 실행할 수 있다. 또한, 아직 실행/완료되지 않은 태스크에 대해서는 실행 대기열에 추가하여 진척 상황을 확인할 수 있다.

그래프 파이프라인과 절차적 스크립트 파이프라인 비교

간단한 스크립트를 이용해서 각 단계를 선형 체인(Linear Chain) 형태로 실행할 수 있다. 우산 판매 예측을 위한 ML 모델 개발 시퀀스에서 머신러닝 모델을 훈련하기 위한 파이프라인 구축을 다음 단계로 진행한다고 가정한다.

  1. 판매 데이터 준비 과정 :
    1. 원천 시스템에서 판매 데이터 추출
    2. 요구사항에 맞게 데이터 정제 및 변환
  2. 날씨 데이터 준비 과정 : 
    1. API로부터 날씨 데이터 가져오기
    2. 요구사항에 맞게 데이터 정제 및 변환
  3. 수요 예측 모델 생성을 위해 판매 및 날씨 데이터 세트를 결합하여 새로운 데이터 세트 생성
  4. 생성된 데이터 세트를 이용해 머신러닝 모델 훈련
  5. 머신러닝 모델을 배포하여 비즈니스에 사용

그래프 기반의 표현은 전체 작업을 하나의 모놀리식(Monolithic, 단일) 스크립트 또는 프로세스로 구성되는 것이 아니라 파이프라인을 작은 점진적인 태스크로 명확하게 분리할 수 있다는 특성을 갖는다. 모놀리식 스크립트는 파이프라인 중간 태스크가 실패함에 따라 전체 스크립트를 재실행해야 하기 때문에 비효율적인 반면, 그래프 기반 표현에서는 해당 실패한 태스크(와 그 이후 태스크)만 재실행하면 되므로 효율적이다.

워크플로우 매니저를 이용한 파이프라인 실행

의존성 있는 그래프 태스크 실행에는 워크플로우 매니지먼트 솔루션이 필요할 수 있다.

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

Oozie 같은 XML(정적) 파일을 사용하여 워크플로우를 정의하는 툴은 읽기는 쉽지만 유연하지 않고, Luigi 및 Airflow와 같은 도구는 코드로 워크플로우를 정의할 수 있어 좀 더 유연하지만 읽기 및 테스트가 어려울 수 있다.

더불어, Make나 Luigi는 워크플로우 스케쥴을 위한 기본기능을 지원하지 않아 스케줄링을 위해 Cron과 같은 3rd party 도구를 사용해야 한다.