데이터 파이프라인이란?
데이터 파이프라인을 만들 때 고려할 점
간단한 ETL 작성해보기
Airflow 소개
Airflow 구성
ETL(Extract, Transform, Load)
= Data Pipeline = Data Workflow
Airflow에서는 DAG(Directed Acyclic Graph)라고 불림
데이터를 데이터 웨어하우스(DW) 외부에서 내부로 가져오는 프로세스(Engineer)
ELT
데이터 레이크 vs 데이터 웨어하우스
데이터 레이크(DL)
구조화 데이터 + 비구조화 데이터
보존 기한이 없는 모든 데이터를 원래 형태대로 보존하는 스토리지에 가까움
보통 DW보다 몇 배는 더 큼
다양한 데이터 파이프라인 스케줄링을 위해 Airflow 사용
데이터 웨어하우스(DW)
구조화 데이터
보존 기한이 있는 데이터를 저장하고 처리하는 스토리지
Looker, Tableau 등 BI 툴은 보통 DW 사용
데이터 파이프라인 종류
Raw Data ETL Jobs(Engineer)
Summary / Report Jobs(Analyst)
DW(혹은 DL)에서 데이터 읽어 다시 DW에 쓰기
Raw Data를 읽어 요약, 분석 형태의 테이블을 만드는 용도
Production Data Jobs
DW로부터 데이터를 읽어 다른 스토리지로 쓰는 ETL
요약 정보가 프로덕션 환경에서 성능 상의 이유로 필요하거나, ML 모델에서 필요한 피처들을 미리 계산해두는 경우 사용
데이터 파이프라인은 버그, 데이터 소스 상의 이슈 등 많은 이유로 실패함
데이터 파이프라인의 수가 늘어나면 유지보수 비용이 기하급수적으로 늘어남
가능하면 데이터가 작을 경우에는 매번 통채로 복사해서 테이블 만들기(Full Refresh)
멱등성(Idempotency)을 보장하는 것이 중요
동일한 입력 데이터로 데이터 파이프라인을 다수 실행해도 최종 테이블의 내용이 달라지지 않아야 함
SQL 트랜잭션을 사용해 critical point들이 모두 하나의 동작으로 실행되어야 함
실패한 데이터 파이프라인을 재실행하느 것이 쉬워야 함
과거 데이터를 다시 채우는 과정(Backfill)이 쉬워야 함
데이터 파이프라인 입출력을 명확히 하고 문서화해야 함
데이터 요청자(비즈니스 오너) 명시
데이터 카탈로그에서 데이터 리스커버리에 사용 가능
불필요한 데이터 주기적으로 삭제
데이터 파이프라인 사고 발생할 때마다 사고 리포트(post-mortem) 작성
같거나 비슷한 사고 재발 방지 목적
사고 원인을 이해하고 이를 방지하기 위한 액션 아이템의 실행이 중요
기술 부채 정도를 나타내는 척도
중요 데이터 파이프라인의 입출력 체크
입력 레코드, 출력 레코드 수 확인
요약 테이블 생성해 PK 존재할 경우 PK uniqueness 보장되는지 확인
중복 레코드 확인
DW(AWS Redshift) 연결 및 테이블 생성
파이썬으로 extract, transform, load 3개의 함수 작성해 CSV 파일을 DW에 적재
파이썬으로 작성되었고, 가장 많이 사용되는 데이터 파이프라인(ETL) 프레임워크
데이터 파이프라인 스케줄링 지원
ETL을 쉽게 생성할 수 있도록 도와줌
다양한 데이터 소스와 DW를 쉽게 통합할 수 있는 모듈 제공
ETL 관리와 관련해 Backfill 등의 다양한 기능 제공
ETL을 DAG(Directed Acyclic Graph)라고 부름
총 5개의 컴포넌트로 구성
웹 서버
스케줄러
워커(Worker)
메타 데이터 DB
큐
웹 UI는 스케줄러와 DAG의 실행 상황 시각화
스케줄러와 DAG의 실행 결과는 별도의 DB에 저장
스케일링 방법
스케일 업: 서버 사양 증가
스케일 아웃: 서버 추가
구조도
Executor 종류
Sequential Executor
Local Executor
Celery Executor
Kubernetes Executor
CeleryKubernetes Executor
Dask Executor
Airflow 장점
ETL을 세밀하게 제어 가능
다양한 데이터 소스와 DW 지원
Backfill이 쉬움
Airflow 단점
배우기 쉽지 않음
개발환경 구성이 쉽지 않음
직접 운영하는 것이 쉽지 않아 클라우드 버전 선호
DAG
태스크로 구성됨
태스크는 Airflow의 오퍼레이터로 생성됨
3개의 태스크로 구성될 경우, Extract, Transform, Load
t1 실행 후 t2와 t3가 분기