[데엔스터디4] ETL/Airflow소개
데이터엔지니어링 스타터 키트 -4주차 후기
아래의 내용은 직접 유료강의를 수강하고, 배운점 및 추가로 공부한 내용을 기록한 내용입니다.
프로그래머스에서 진행하는 실리콘밸리에서 날아온 데이터엔지니어링 스타터키트 강의추전!
ETL이란?
ETL : Extract, Transform, Load
하나의 데이터 소스에서 어떤 데이터 하나를 읽어다가, (Extract)
원하는 포맷으로 바꿔서, (Transform)
그걸 DW에 테이블로 로딩하는 작업 (load)
ELT : Extract, Load, Transform
하나의 데이터 소스에서 어떤 데이터 하나를 읽어다가, (Extract)
Transform작업 없이 다 '데이터레이크'에 복사하고, (Load)
데이터레이크 중에서 의미가 있고 최근 데이터만 원하는 포맷으로 바꿔서 사용 (Transform)
ETL과 ELT의 차이점
내가 이전에 한번 정리한 내용 + 수업때들은 내용 요약정리
2021.08.16 - ETL ELT 차이 | 요즘엔 ETL에서 ELT로 흐름이 바뀌고 있다?@!
데이터파이프라인이란?
소스에서 목적지로 데이터를 옮겨주는 작업
소스→DL, DL→DW, 소스→DW, DW→ DW등 각각의 단계가 데이터파이프라인이 된다
데이터파이프라인 형태
- raw data ETL하는 job
- Summary/Report를 만드는 job
- DW -> Product 스토리지에 저장하는 job
간단한 ETL작성해보기
내가 지금까지 의식하지 않고 python으로 개발했던 경험들이 다 데이터파이프라인을 작성하는 부분이여서 신기했다.
예를 들면 CSV나 API를 통해서 데이터를 가지고 오는것은 extract에 해당했고,
그 데이터들을 가지고 dafaframe으로 변형해서 사용하는건 transform에 해당했고,
마지막으로 그 데이터들을 별도의 db나 redshift에 저장하는게 load에 해당했다.
Airflow란?
ariflow의 특징
- 파이썬기반의 데이터파이프라인 프레임워크 -> ETL작성 및 관리(실행순서,재실행,backfill) 유용하다
- 웹ui 지원
- DAG : 데이터파이프라인 하나의 단위 , 하나이상의 task로 구현
- TASK : 에어플로우의 operator, extract, transform, load 등 각각의 task가 되고 task간의 실행순서 정의가능
- 다수의 서버로 분산이 가능한 클러스터 (스케일아웃 지원)
- DAG의 과거 실행정보를 기록할 DB필요 (기본 sqlite)
- 2020.12 2.0버전 release
ariflow의 컴포넌트
- 웹서버
- 스케쥴러 : 스케쥴링 시간이 되면 이 DAG를 실행해야하는구나! → 워커한테 넘김
- 워커 : 스케쥴러에 의해 받은 DAG실행! , 실제 DAG코드가 구현되는 컨테이너 역할
- DB : 기본 sqlite -> MYSQL,postrgeSQL 별도로 설치해서 사용
- 큐 : DAG의 task를 큐에 넣으면, 큐에서 task를 하나씩 읽어다가 워커에 나눠줌 (Multi-node 일때 필요)
ariflow의 확장(Scaling)
- scale up : 노드 하나를 쓸 땐 더 좋은 사양의 서버를 사용하는 것
- scale out : 서버(워커노드)를 한대 더 추가하는 것, 에어플로우는 스케일아웃 지원
ariflow의 장단점
- 장점 : ETL작성 및 관리(실행순서,재실행,backfill) 유용하다
- 단점 : 배울때 learning curve존재 (용어이해), 클러스터관리 -> 자동관리를 위해 클라우드 Saas사용하기
DAG 생성예시
- 파이썬 코드 import : from airflow import DAG
- dag의 속성지정 (deafult_args )
- 시작일(start_date): 실제로 실행되는 날짜가 아니라 DAG가 COPY를 해야하는 날짜
- 종료일(end_date)
- 이메일 : 실패하면 받을 주소
- retries : 재시작횟수
- retry_delay : 재시도하기 위해 기다리는 시간
- DAG의 객체 파라미터
- 첫번재인자 : DAG 이름 → 웹 UI에 나옴
- schedule_interval : 크론탭이랑 동일한 규칙으로 적용
- deafult_args : 앞에서 생성한 dag의 속성(deafult_args)을 넣음
데이터파이프라인 생성시 고려해야할점
어떤 문제가 생길 수 있는가?
- 결국 python으로 직접 짠 코드이기 때문에 '버그'가 있다. 항상 잘 돌아갈 것이라는건 환상!
- 데이터소스에 따라서 문제가 생길수도 있다. 이건 해결할 수 없음
- 데이터파이프라인이 많아지면 dependency가 생기고, 유지보수 비용이 늘어난다.
그래서 어떻게 해야하나?
- 데이터가 작으면 매번 통쨰로 읽어다가 업데이트하는게 제일 좋다 (incremental update는 복잡도가 올라감)
- 멱등성을 보장: 동일한 입력 데이터로 데이터파이프라인을 다수 실행해도 최종 테이블의 내용이 달라지지 않는다.
- 실패한 데이터파이프라인 재실행/backfill이 쉬워야한다 -> execution_data 파라미터 사용
- 데이터파이프라인의 입력과 출력을 명확히 하고 문서화
- 사고날때마다 사고리포트