데이터 파이프라인과 Airflow
‘Apache Airflow 기반의 데이터 파이프라인’ 내용을 기반으로 작성되었습니다.
데이터 파이프라인
- 최근 데이터에 대한 집중이 높아져서 데이터 파이프라인을 구축해서 관리하고 있음
- 데이터 파이프라인을 핸들링하는 기술은 Airflow, Luigi와 같이 다양한 기술들이 활용되고 있음
- 데이터 파이프라인은 보통 ETL 파이프라인이라고 하는데, Extract(추출), Transform(변환), Load(적재) 의 과정을 거치는 파이프라인
- 반드시 ‘데이터 파이프라인 = ETL 파이프라인’ 인 것은 아님
- 최근 클라우드 시스템을 활용하면서 ELT의 순서를 사용하기도 함
데이터 파이프라인이란
- 이름에서 알 수 있듯이 데이터가 마치 물처럼 흘러서 갈 수 있게 파이프라인을 만들어 주는 것
- 데이터 파이프라인이란 앞서 간단하게 말했듯이 데이터를 추출해서 가져오는 과정을 담은 파이프라인
- ETL은 데이터 파이프라인의 서브셋이므로 그 자체는 아님
- 데이터 파이프라인을 통해 들어온 데이터는 최종적으로 data warehouse에 일반적으로 적재됨
- 최근에 데이터 파이프라인을 구축에는 다음과 같은 것들이 사용됨
- 분산 처리 프레임워크
- Hadoop, Spark
- 데이터가 대규모로 수집되는 현재 시대에서 하나의 컴퓨터로 데이터를 핸들링하는 것보다 분산 처리 방식을 사용해서 대량의 데이터를 병렬로 처리함
- keyword : Hadoop EcoSystem, Spark, Scala, MapReduce
- 데이터 레이크
- S3, HDFS
- 데이터를 저장하는 일종의 데이터베이스, 아마 데이터가 너무 많아서 호수와 같다고 붙여진 이름인 것으로 생각됨
- Workflow 관리 시스템
- Airflow, Luigi
- 데이터 셋 생성, 모델 학습과 같은 다양한 태스크를 그래프 로 연결하여 실질적인 파이프라인을 구축하고 관리하는 시스템
- 데이터 웨어하우스
- BigQuery
- 데이터 레이크에서 데이터를 가공해서 분석하기 좋게 정리한 것을 데이터 웨어하우스라고 함
- 분산 처리 프레임워크
데이터 파이프라인 그래프
- 데이터 파이프라인은 태스크간의 순서가 정해진 형태로 진행됨
- 반드시 이전 태스크가 제대로 수행되어야 다음 태스크를 수행할 수 있게 하는 것이 필요함
- 이런 순서가 정해진 동작을 의존성이라 함
- 의존성을 표현하는 방법으로 데이터 파이프라인을 그래프로 표현하는 것이 있음
- 태스크 그래프는 방향성을 갖고 있기 때문에 방향성 그래프 (directed graph) 라고 함
- 각 사각형을 태스크 노드라고 하고 화살표는 태스크 의존성이라 함
- 반드시 태스크 의존성의 끝은 노드를 가리켜야하고 이전 태스크가 실행되어야 다음 태스크가 활성화됨
- 화살표의 끝점이 순환이나 반복을 의미하지 않기 때문에 방향성 비순환 그래프(Directed Acyclic Graph) 라고 함
- 태스크 간의 비순환 속성은 데드락을 방지하기 위해 반드시 필요함
- keyword
- 태스크
- 태스크 노드
- 태스크 의존성
- 방향성 그래프
- 방향성 비순환 그래프
- 비순환 속성
- DAG
파이프라인 그래프 실행
- 파이프라인 수행 알고리즘
- 그래프 안의 태스크는 모두 개방된(open) 상태에서 시작
- 이전 태스크가 완료되었는지 확인
- 태스크가 완료되면 다음 실행할 태스크를 대기열에 추가
- 실행 대기열의 태스크 수행 후 완료시 완료 표시
- 그래프의 모든 태스크가 수행될 때까지 1단계로 돌아감
- 그래프 안의 태스크는 모두 개방된(open) 상태에서 시작
- 이전 태스크를 ‘업스트림’이라고 함
- 최초 태스크들은 업스트림 의존성이 없기 때문에 바로 실행 대기열에 추가됨
- 의문점들
- Q) 여기서 3번째 단계가 이해가 잘 안가는데, 비순환적 속성을 갖고 있는데 만약 1단계로 돌아간다면 순환적 속성이 되는 것이 아닌지..? 혹시 여기서는 의존관계가 아닌건가?
그래프 VS 절차적 스크립트 파이프라인
- 파이프라인 설계 방식에는 DAG를 활용한 그래프 방식도 있지만 스크립트를 활용한 linear chain 형태로 실행할 수 있음
- 이런 단일 스크립트의 파이프라인을 Monolithic(모놀리식) 이라고 함
- 모놀리식 파이프라인의 문제점
- 점진적인 태스크로 분리할 수 없음
- 중간 태스크 실패시 스크립트를 재실행해야하는 문제가 있음
- 예) 내가 맨날 짜는 파이프라인…. (단일 python script)
- 그래프 파이프라인의 보완점
- 실패 태스크 이후부터 재실행할 수 있으므로 효율적 구성
- 파이프라인을 병렬적으로 수행가능
- 태스크를 분리할 수 있음
- 모든 태스크가 의존성으로 다 연결된 게 아닐 수도 있음
- 특정 태스크들을 시작점이 다르게 시작되었다가 특정 태스크에서 합쳐질 수도 있음
- 이런 경우 각 태스크들을 병렬적으로 수행하면 효율적임
Airflow
- Airflow는 Airbnb에서 개발된 오픈소스 workflow management tool
- Argo, Luigi, Metaflow와 같은 다양한 관리 도구가 있음
- Luigi와 Airflow는 파이썬을 활용하기에 확장성이 좋음
- 여기에 Airflow는 스케쥴링 기능을 추가해서 기능적이 측면에서 뛰어남
Python을 사용한 파이프라인 정의
- Airflow는 python으로 DAG를 구조화하고 구성함
- DAG 파일을 파이썬으로 작성하면 Ariflow가 DAG 코드를 파싱해서 수행함
- 이 과정에서 schedule interval 같은 메타데이터를 지정할 수 있음
- python을 쓴다는 점에서 확장성이 좋다는 장점이 있음
파이프라인 스케쥴링
- Airflow 구성요소
- Airflow scheduler : DAG 분석, 스케줄 파악 후 Airflow worker에 DAG 태스크 예약
- Airflow worker : 예약된 태스크 선택 후 실행
- Airflow web server : 스케줄러가 분석한 DAG 시각화, DAG 실행과 결과를 확인하는 인터페이스 제공
- Airflow Scheduler
- DAG 파일 분석 후 DAG 태스크, 의존성 및 예약 주기 확인
- 마지막 DAG까지 확인 후 DAG의 예약 주기를 확인
- 예약된 태스크에 대해 태스크 의존성 확인 후 처리
- 1단계로 돌아가고 루프를 대기
- Ariflow worker
- 실행 후 결과를 지속적 추적
Airflow를 사용하는 경우
Airflow가 적합한 경우
- python을 활용하므로 python을 사용한 방법으로 모든 복잡한 파이프라인 구축이 가능
- python 기반이라 확장성이 좋음
- 스케줄링을 통해 정기적인 실행과 점진적인 처리를 통해 부분 재실행이 가능한 효율적인 파이프라인 구축
- 파이프라인 결과를 지속적으로 모니터링 가능
- 백필 기능을 통한 과거 데이터 재처리
- 백필 : 특정 기간 기준으로 다시 실행하는 기능
- 반복적이고 배치인 태스크를 실행하는 것에 집중되어짐
Airflow가 적합하지 않은 경우
- Airflow는 앞서 말한 특징을 요약하면 반복적이거나 배치 태스크를 실행하는 것에 맞춰져 있으므로 실시간 처리 workflow에는 적합하지 않음
- 추가, 삭제가 태스크가 빈번한 동적 파이프라인은 적합하지 않을 수 있음
- 웹 인터페이스는 DAG의 최근 실행버전의 정의만 표현하므로 실행되는 동안 구조가 변경되지 않는 것이 좋음
- 가장 중요한 것은 Python을 쓸 줄 알아야함
- 파이프라인 규모가 커지면 관리가 어려워질 수 있으므로 초기 사용 시점부터 엄격한 관리가 필요함
Comments powered by Disqus.