Skip to content

data-pipeline-best-practice

TL;DR

  • 표준 패턴 사용, 데이터 유효성 검사, 데이터 중복 방지, DRY 코드 작성, 파이프라인 실행 메타데이터 추적, 테스트 활용 등 은 데이터 파이프라인 구축 시 고려해야 할 모범 사례임

데이터 파이프라인 모범사례

1. 표준 패턴을 사용하여 데이터를 점진적으로 변환

  • 데이터 파이프라인은 원시(Raw), 변환(Transformed), 소비(Consumption) 레이어로 구성됨.
  • 원시 레이어 ( Raw Layer or Bronze Layer )
    • 상류 소스 시스템에서 데이터를 그대로 저장.
    • 메타데이터 컬럼을 포함하여 데이터 계보 추적과 재처리 용이성을 제공.
  • 변환 레이어 ( Transformed Layer or Silver Layer )
    • 원시 레이어 데이터를 표준화하고 정제하여 엔터프라이즈 관점을 제공.
    • ELT 방식을 사용하여 빠른 데이터 로드 및 최소한의 변환 적용.
  • 소비 레이어 ( Consumption Layer or Gold Layer )
    • 변환된 데이터를 소비 준비 상태로 조합.
    • 읽기 최적화된 데이터 모델을 사용하여 보고서 작성 및 고급 분석을 지원.
  • 입력이 되는 상류를 Upstream, 출력이 되는 하류를 Downstream이라고 부르기도 함.
graph LR
    subgraph "데이터 파이프라인"
        direction LR
        subgraph "원시 레이어 (Bronze)"
            B --> B1
            B1["Raw Integration"]
            B1 --> B2["Landing zone for raw data, no schema needed"]
        end

        subgraph "변환 레이어 (Silver)"
            C --> C1
            C1["Filtered, Cleaned, Augmented"]
            C1 --> C2["Define structure, enforce schema, evolve schema as needed"]
        end

        subgraph "소비 레이어 (Gold)"
            D --> D1
            D1["Business-Level Aggregates"]
            D1 --> D2["Deliver continuously updated, clean data to downstream users and apps"]
        end

        A["Raw Data"] --> B["원시 레이어 (Bronze)"]
        B --> C["변환 레이어 (Silver)"]
        C --> D["소비 레이어 (Gold)"]
    end


2. 데이터를 소비자에게 노출하기 전에 유효성을 확인 (데이터 품질 검사, DQ)

  • 데이터를 소비자에게 노출하기 전에 유효성을 확인해야 함.
  • Great Expectations 라이브러리 등을 사용하여 유효성 검사할 수 있음
  • 과도한 데이터 품질 검사는, 파이프라인 실행 시간과 비용을 높힐 수 있기 때문에 적절한 수준의 검사를 수행

3. 중복 데이터를 피하기 위한 멱등성 파이프라인

  • 필연적으로 Backfilling 또는 오류 발생 시 재처리를 수행해야 하는데, 이 때 중복 데이터를 방지해야 함.
  • 멱등성(idempotence) 을 보장하는 파이프라인 설계가 필요함.
  • 구현
    • Run ID 기반 덮어쓰기: Run Id 는 데이터 생성된 시간 범위로 보통 잡음 ( e.g. 생성된 날짜 ) 이를 기반으로 덮어쓰기를 통해서 Idempotent를 보장
    • 키 기반 UPSERTS: 키를 사용하여 기존 행을 업데이트하거나 새로운 행을 삽입. SCD ( Slowly Changing Dimension ) 등을 처리할 때 사용.

4. DRY 코드 작성 및 I/O를 데이터 변환에서 분리

  • 반복 코드 최소화 ( Don't Repeat Yourself, DRY )
    • 코드 : 코드 중복을 최소화하여 유지보수성을 높임
    • 패턴 : 데이터를 처리하는 패턴을 따르도록 하여, 코드의 일관성 및 중복 방지.
  • I/O와 변환 로직 분리: I/O 함수는 변환 로직에서 분리하여 테스트 및 디버깅 용이성 제공.
  • OOP 의 SRP 를 생각해보면 됨. I/O 와 데이터 변환은 서로 다른 책임을 가지고 있음.

5. 파이프라인 실행의 메타데이터를 추적하여 디버깅 용이성 확보

  • 파이프라인 실행 메타데이터 추적: 각 처리 단계에 대한 입력 및 출력, 시작 및 종료 시간, 재시도 횟수 등을 추적.
  • 데이터셋 메타데이터 관리: 유일 키 (PK), 물리적 저장 위치, 테이블 이름, 저장 형식, 파티션 키, 데이터 스키마 등을 버전 관리.

6. 코드 동작을 확인하고 기존 로직을 깨뜨리지 않도록 테스트 활용

  • 테스트 유형: 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트를 통해 코드 동작 확인.
    • 단위 테스트: 개별 함수가 예상대로 작동하는지 확인.
    • 통합 테스트: 두 개 이상의 시스템이 예상대로 함께 작동하는지 확인.
    • 엔드 투 엔드 테스트: 시스템이 시작부터 끝까지 예상대로 작동하는지 확인.
  • 테스트 실행: pytest를 사용하여 테스트 케이스를 실행.

Reference