목차
1. Apache Airflow 살펴보기
데이터 파이프라인 소개
일반적인 데이터 파이프라인은 원하는 결과를 얻기 위해 실행되는 여러 태스크 또는 동작으로 구성된다.
예를 들어, 다음 주 날씨를 알려주는 쇼핑몰의 날씨 대시보드를 구축하는 시퀀스에서, 다음의 태스크가 수행되어야 한다.
- 다른 시스템의 날씨 API를 통해 일기 예보 데이터를 가져온다.
- 서비스 목적에 맞도록 데이터를 정제하거나 변환(ex. 온도를 화씨에서 섭씨로 변환) 한다.
- 변환된 데이터를 날씨 대시보드로 전송한다.
위의 3가지 서로 다른 태스크는 프로세스 실행 시 정해진 순서대로 진행되어야 한다.
데이터 파이프라인 그래프
태스크 간 의존성을 명확하게 확인하기 위해 데이터 파이프라인을 그래프로 표현할 수 있다. 태스크는 노드로, 태스크 간 의존성은 노드 간 방향으로 표시할 수 있어, 방향성 그래프(directed graph)라고도 한다.
위 날씨 대시보드를 위한 데이터 파이프라인 그래프는 방향성 비순환 그래프 (Directed Acycli Graph, DAG)라고 부른다. 이는 방향성의 끝점(Directed Edge)를 포함하되 반복이나 순환을 허용하지 않는다. (비순환, Acyclic) 이러한 속성은 태스크 간 순환 실행을 방지하기 때문에 태스크 간 상호 의존성으로 인한 논리적 오류(Deadlock)인 교착 상태로 이어질 가능성을 없앤다.
파이프라인 그래프 실행
DAG는 파이프라인 실행을 위한 단순한 알고리즘을 제공한다는 장점을 갖는다. 알고리즘을 개념적으로 설명하면, 다음 단계로 구성된다.
- 그래프 안에 태스크는 각각 개방된(Open) 상태이며(==미완료) 다음 단계를 수행한다.
- 각각의 화살표 끝점은 태스크를 향하며 다음 태스크로 향하기 전에는 이전 태스크가 완료되었는지 확인합니다. (1단계)
- 태스크가 완료되면 다음에 실행해야 할 태스크를 대기열에 추가합니다.
- 실행 대기열에 있는 태스크를 실행하고 태스크 수행이 완료되면 완료 표시를 합니다.
- 그래프의 모든 태스크가 완료될 때까지 1단계로 돌아갑니다.
위 단계에 대해 대시보드 파이프라인 실행 정보를 추적함으로써 업스트림 의존성이 해결되었는지 확인하고 이후 태스크를 실행할 수 있다. 또한, 아직 실행/완료되지 않은 태스크에 대해서는 실행 대기열에 추가하여 진척 상황을 확인할 수 있다.
그래프 파이프라인과 절차적 스크립트 파이프라인 비교
간단한 스크립트를 이용해서 각 단계를 선형 체인(Linear Chain) 형태로 실행할 수 있다. 우산 판매 예측을 위한 ML 모델 개발 시퀀스에서 머신러닝 모델을 훈련하기 위한 파이프라인 구축을 다음 단계로 진행한다고 가정한다.
- 판매 데이터 준비 과정 :
- 원천 시스템에서 판매 데이터 추출
- 요구사항에 맞게 데이터 정제 및 변환
- 날씨 데이터 준비 과정 :
- API로부터 날씨 데이터 가져오기
- 요구사항에 맞게 데이터 정제 및 변환
- 수요 예측 모델 생성을 위해 판매 및 날씨 데이터 세트를 결합하여 새로운 데이터 세트 생성
- 생성된 데이터 세트를 이용해 머신러닝 모델 훈련
- 머신러닝 모델을 배포하여 비즈니스에 사용
그래프 기반의 표현은 전체 작업을 하나의 모놀리식(Monolithic, 단일) 스크립트 또는 프로세스로 구성되는 것이 아니라 파이프라인을 작은 점진적인 태스크로 명확하게 분리할 수 있다는 특성을 갖는다. 모놀리식 스크립트는 파이프라인 중간 태스크가 실패함에 따라 전체 스크립트를 재실행해야 하기 때문에 비효율적인 반면, 그래프 기반 표현에서는 해당 실패한 태스크(와 그 이후 태스크)만 재실행하면 되므로 효율적이다.
워크플로우 매니저를 이용한 파이프라인 실행
의존성 있는 그래프 태스크 실행에는 워크플로우 매니지먼트 솔루션이 필요할 수 있다.
이름 | 시작회사 | 워크플로우 정의 | 개발 언어 | 스케쥴 관리 |
백필 (Backfill) |
사용자 인터페이스 |
플랫폼 설치 |
수평 확장 |
Airflow | Airbnb | 파이썬 | 파이썬 | 지원 | 지원 | 지원 | Anywhere | 지원 |
Argo | Applatix | YAML | Go | 3rd party | 미지원 | 지원 | Kubernetes | 지원 |
Azkaban | 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 도구를 사용해야 한다.
'DevOps > #Continuous Testing' 카테고리의 다른 글
[Data Pipeline] Apache Airflow 기반의 데이터 파이프라인 (2) (0) | 2024.07.15 |
---|---|
[CI/CD] Polyspace, VectorCast, Hotfix (0) | 2022.12.09 |
[CI/CD] ATS(TestPresso), CANalyzer (0) | 2022.12.08 |