[데이터 엔지니어링 데브코스] TIL 40일차 - 데이터 파이프라인과 Airflow(4)

박단이·2023년 12월 18일
0

데브코스 TIL

목록 보기
40/56

오늘 배운 것🤓

PK Uniqueness 보장

PK (Primary Key)

  • 테이블에서 하나의 레코드를 유일하기 지칭할 수 있는 필드(들)
  • 하나의 필드가 일반적이지만 다수의 필드 사용 가능
  • 다수의 필드를 PK로 사용할 경우 일부 필드는 FK일 수도 있다.
  • 하지만 Data Warehouse는 PK를 지켜주지 않는다.
    (Why? 보정하는데 메모리와 시간이 더 들기 때문에 대용량 데이터의 적재에 걸림돌이 된다.)
    => 이를 보장하도록 하는 것이 데이터 인력의 책임!!!

PK 유지 방법

  • PK 설정한 field가 중복이 된다면 created_date를 정렬하여 더 최신의 값을 유지한다.
    (이는 날씨 예보와 같은 최신의 값이 더 정확할 경우 사용하고 각각의 케이스에 맞춰서 유지 기준을 세우자.)
ROW_NUMBER() OVER (partition by 그룹기준필드명 order by 정렬기준필드명 DESC) AS seq
  • 위의 SQL 문법을 사용하여 정렬을 할 수 있다. 그룹화의 기준이 되는 필드명이 PK 필드이고 정렬기준을 created_date로 설정한다.

  • DAG에서 돌아가는 로직의 순서는 아래와 같다.

  1. 임시 테이블을 만들고 원본 테이블을 복사한다.
  2. 임시 테이블에 새로운 레코드를 적재한다.
  3. 중복을 걸러주기 위해 위의 SQL을 활용한다.
    • 최신 레코드를 우선순위로 선택
    • ROW_NUMBER를 사용하여 PK별로 하나의 레코드를 생성한다.
  4. 원본 테이블의 레코드를 먼저 삭제한 후, 1~3을 통해 만들어진 레코드를 원본 테이블로 복사한다.
  • 1~3번의 임시 테이블을 임시로 사용하고 자동으로 지워지기 때문에 transaction으로 감쌀 필요가 없지만 4번은 원본 테이블을 삭제하고 삽입하는 과정이므로 transaction으로 꼭! 감싸줘야 한다.

Upsert

위의 과정을 지징하는 말로써, Update + Insert의 합성어이다. 존재하는 레코드라면 새로운 정보로 수정하고, 존재하지 않는 레코드라면 새로운 레코드로 적재한다.
보통 data warehouse마다 Upsert를 효율적으로 해주는 문법을 지원한다.

Backfill

  • 한국말로 하면 '되메우기질을 하다'라는 뜻으로, airflow에서는 에러가 나서 비워진 공간을 채우기 위한 작업을 말한다.
  • Incremental Update 시에만 의미가 있다.
    • Full Refresh의 경우 어차피 다시 받으면 처음부터 끝까지 받아지기 때문이다.)
    • 효율성이 더 좋을 수 있지만 운영/유지 보수의 난이도가 올라가기 때문에 웬만하면 full refresh를 사용하도록 하자.
  • 과거 데이터를 모두 다시 읽어와야하는 경우 그 날짜를 모두 재실행해야 한다.
  • Backfill이 유연하고 편할 수록 데이터 엔지니어 삶에 행복도가 바뀌기 때문에 실패한 데이터 파이프라인의 재실행이 얼마나 용이한 구조인가?에 대해 항상 고민해야 한다.

ETL을 어떻게 구현해야할까?

  1. 날짜 별로 backfill 결과를 기록하고 성공 여부의 기록을 남긴다.
    -> 나중에 결과를 쉽게 확인할 수 있다.
  2. 이 날짜를 시스템에서 자동으로 ETL 인자로 제공하도록 하자.
  3. 읽어와야 하는 데이터의 날짜를 계산하는 것이 아니라, 시스템이 지정해준 날짜를 이용하자.

위의 내용이 Airflow에는 이미 구현이 되어있다. 위의 이유로 Airflow가 중요한 것이다!

  1. ETL별로 실행날짜와 결과를 메타 DB에 기록한다.
  2. 모든 DAG 실행에는 "execution_date"가 지정되어 있다.
  3. "execution_date"로 채워야하는 날짜와 시간이 넘어온다.
    -> 데이터를 갱신하도록 코드를 작성해야 한다.

Airflow 변수

  • start_date
    • DAG가 처음 읽어와야 하는 데이터의 날짜/시간
    • 실제 첫 실행 날짜는 start_date+DAG의 실행 주기
  • execution_date
    • DAG가 읽어와야 하는 데이터의 날짜와 시간
  • catchup
    • DAG가 처음 활성화된 시점이 start_date보다 미래라면 그 사이에 생긴 공백을 메꿀지 무시할지 결정하는 인자
    • True : 비어있는 시간을 따라잡는다.(default)
    • False : 비어있는 시간을 무시한다.
  • end_date
    • optional한 기능이므로 보통 필요 X
    • Backfill을 날짜 범위에 대해 지정해야할만 사용
    • airflow dags backfill -s 시작날짜 -e 종료날짜


느낀 점😊

수업이 어려운 것이 아니라 예기치못했던 에러가 제일 어려웠다. 3일동안 고민했다... docker-compose.yaml을 수정했으면 다시 한번더 up을 해주자... 업...어업...업....

profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글