기록 블로그

프로그래머스 데브코스-데이터 엔지니어/TIL(Today I Learned)

06/23 55일차 DBT와 데이터 카탈로그

usiohc 2023. 6. 23. 18:07

DBT, 데이터 카탈로그


주요 메모 사항


dbt Seeds

Seeds란?

많은 dimension 테이블들은 크기가 작고 많이 변하지 않음

 

Seeds는 이를 파일 형태로 데이터웨어하우스로 로드하는 방법

ㄴ Seeds는 작은 파일 데이터를 지칭 (보통 csv 파일)

 

 

1. dbt - seed 폴더에 csv 테스트 파일 생성

 

 

2. 만드려고 하는 테이블의 레코드 값을 넣어준다

 

3. dbt seed 실행해서 빌드

 

 

4. Colab에서 redshift에 연결해 확인

 

 


dbt Sources

Staging 테이블을 만들 때 입력 테이블들이 자주 바뀐다면?

ㄴ models 밑의 .sql 파일들을 일일이 찾아 바꿔주어야함

ㄴ 이 번거로움을 해결하기 위한 것이 Sources

    ㄴ 입력 테이블에 별칭을 주고 별칭을 staging 테이블에서 사용

 

 

Sources 소개

기본적으로 처음 입력이 되는 ETL 테이블을 대상으로 함

ㄴ 별칭 제공, 최신 레코드 체크 기능 제공

 

테이블 이름들에 별명(alias)을 주는 것

ㄴ 이를 통해 ETL단의 소스 테이블이 바뀌어도 뒤에 영향을 주지 않음

ㄴ 추상화를 통한 변경처리를 용이하게 하는 것

ㄴ 이 별명은 source 이름과 새 테이블 이름의 두 가지로 구성됨

    ㄴ 예) raw_data.user_metadata -> keeyong, metadata 

 

Source 테이블들에 새 레코드가 있는지 체크해주는 기능도 제공

 

1. Sources.yml 생성, models 폴더에 생성한다!

 

2. 이미 작성했던 src_user_event.sql로 예시 -> 수정, 템플릿 변수로 표현할 것

WITH src_user_event AS (
 SELECT * FROM raw_data.user_event -> {{ source ('asltn99', 'event') }}
)
SELECT
    user_id,
    datestamp,
    item_id,
    clicked,
    purchased,
    paidamount
FROM
    src_user_event

 

3. 기존에 작성했던 models 내의 src들은 redshift의 raw_data에 접근했었는데, 해당 sql들을 모두 템플릿 변수를 사용해 수정해보자

 

4. dbt run : 다만, 테스트가 가능한 코드가 아님 mapping 되는 것만 확인

 


Sources 최신성 (Freshness)

ㄴ 특정 데이터가 소스와 비교해서 얼마나 최신성이 떨어지는지 체크하는 기능

ㄴ dbt source freshness 명령으로 수행

이를 하려면 models/sources.yml의 해당 테이블 밑에 아래 추가

지금 raw_data.user_event 테이블에서 datestamp의 최대값이 현재 시간보다 1시간 이상 뒤쳐져 있지만 24시간은 아니라면 warning. 24시간 이상이라면 error를 raise

 

      loaded_at_field: datestamp

        freshness:

          warn_after: { count: 1, period: hour }

          error_after: { count: 24, period: hour }

 

 

{{ source ('asltn99', 'event') }} 로 작성된 raw_data.user_event 에 datestamp를 확인할 것 

 

정상적으로 error가 발생 확인

해당 redshift에 insert into value 권한이 없기 때문에 성공은 기용님의 화면으로만 확인했음

 

기용님 실습

기용님 기준 date는 2023-06-22 13:34:05

 

해당 redshift의 raw_data.user_event 테이블에 24시간 이내의 datetime 값을 가진 레코드 추가

 

위에서 작성한 dbt source freshness를 실행 -> 1시간 이상의 차이가 있어서 WARN이 나옴

 

 


dbt Snapshots

데이터베이스에서 스냅샷이란?

Dimension 테이블은 성격에 따라 변경이 자주 생길 수 있음

 

dbt에서는 테이블의 변화를 계속적으로 기록함으로써 과거 어느 시점이건 다시 돌아가서 테이블의 내용을 볼 수 있는 기능을 이야기함

ㄴ 이를 통해 테이블에 문제가 있을 경우 과거 데이터로 롤백 가능

ㄴ 다양한 데이터 관련 문제 디버깅도 쉬워짐

 

 

SCD Type 2와 dbt

Dimension 테이블에서 특정 entity에 대한 데이터가 변경되는 경우

예) employee_jobs 테이블

ㄴ 특정 employee_id의 job_code가 바뀌는 경우 

ㄴ 변경시간도 같이 추가되어야함

 

새로운 Dimension 테이블을 생성 (history/snapshot 테이블)

ㄴ 위에서 변경된 레코드가 history 테이블에 저장

ㄴ 여기서 PK는 EMPLOYEE_ID이고 JOB_CODE가 변경됨에 따라서 값이 추가

 

 

dbt snapshot 적용해보기

1. snapshots/scd_user_metadata.sql 추가

 

2. Snapshot를 만들 테이블을 지정, config로 값들 지정

 

3. dbt snapshot, 해당 명령을 통해서 redshift에는 원본과 같은 테이블이 생성되었을 것

 

 

4. scd_user_metadata 테이블 확인 해보기, 처음 실행했기 때문에 dbt_valid_to는 모두 null

 

 

raw_data.user_metadata 업데이트 실습

소스 테이블의 기존 레코드 하나의 age 그룹을 변경할 것, 먼저 확인 (필자는 권한이 없어서 기용님 기준)

 

그리고 dbt snapshot 실행

 

 

scd_user_metadata에 레코드 추가되었는지 확인

 

 


dbt Tests

Tests 소개

데이터 품질을 테스트하는 방법, 두 가지가 존재

내장 일반 테스트 (“Generic”)

ㄴ unique, not_null, accepted_values, relationships 등의 테스트 지원

ㄴ models 폴더

 

커스텀 테스트 (“Singular”)

ㄴ 기본적으로 SELECT로 간단하며 결과가 리턴되면 “실패”로 간주

ㄴ tests 폴더

 

 

 

Generic Tests 구현

models/schema.yml 파일 생성

 

dbt test로 테스트 실행

 

 

 

Singular Tests 구현

tests/dim_user_metadata.sql 파일 생성 - Primary Key Uniqueness 테스트

 

dbt test로 테스트 실행, 위에서 작성했던 unique와 not_null 이외에 1번으로 test가 추가된 것을 볼 수 있

 

하나의 테이블 대상으로 실행하려면?

dbt test --select dim_user_metadata / 만일 디버깅하고 싶다면 dbt --debug test --select dim_user_metadata

위에서 작성했던 2개의 테스트 파일이 모두 dim_user_metadata 테이블이기 때문에 명령어를 실행해도 겉으로 보기에 똑같이 실행된다.

 

 


dbt Documentation

dbt 문서화 소개

기본 철학은 문서와 소스 코드를 최대한 가깝게 배치하자는 것

문서화 자체는 두 가지 방법이 존재

ㄴ 기존 .yml 파일에 문서화 추가 (선호되는 방식)

ㄴ 독립적인 markdown 파일 생성

 

이를 경량 웹서버로 서빙

ㄴ overview.md가 기본 홈페이지가 됨

ㄴ 이미지등의 asset 추가도 가능

 

 

models 문서 만들기

1. description 키를 추가: models/schema.yml, models/sources.yml

 

2. dbt docs generate / 명령어를 실행해도 permissions error가 발생한다 (접근 가능한 정보만 docs으로 생성된다는 뜻)

ㄴ 사용자 권한이 더 있다면 Redshift로부터 더 많은 정보를 가져다가 보여줌

ㄴ 결과 파일은 target/catalog.json 파일이 됨

 

다음 위치에 json형태로 카탈로그가 생성된다

 

 

3. dbt docs serve로 웹서버 띄우기

 

Lineage Graph, 현재 보고있는 문서에 관련한 그래프가 나온다

 

 


dbt Expectations

dbt Expectations 소개

Great Expectations에서 영감을 받아 dbt용으로 만든 dbt 확장판

https://github.com/calogica/dbt-expectations

 

설치 후 packages.yml에 등록해야 함

packages:
 - package: calogica/dbt_expectations
 version: [">=0.7.0", "<0.8.0"]

보통은 앞서 dbt 제공 테스트들과 같이 사용, models/schema.yml 

 

dbt Expectations 함수들 일부

  • expect_column_to_exist
  • expect_row_values_to_have_recent_data
  • expect_column_values_to_be_null
  • expect_column_values_to_not_be_null
  • expect_column_values_to_be_unique
  • expect_column_values_to_be_of_type
  • expect_column_values_to_be_in_set
  • expect_column_values_to_not_be_in_set
  • expect_column_values_to_be_between

대충 느낌만 이해하자, column이 존재하는지, column values가 null인지 등

 

 



데이터 카탈로그 소개

데이터 카탈로그는 주요 데이터 기술 스택!

많은 회사들이 데이터 카탈로그를 메인 데이터 거버넌스 툴로 사용

ㄴ Pinterest, Udemy, LinkedIn, Uber, …

 

 

데이터 카탈로그

데이터 자산 메타 정보 중앙 저장소

데이터 거버넌스의 첫 걸음

ㄴ 많은 회사에서 데이터 카탈로그를 데이터 거버넌스 툴로 사용하거나 데이터 카탈로그 위에 커스텀 기능을 구현

데이터 카탈로그의 중요한 기능

ㄴ (반)자동화된 메타 데이터 수집!

ㄴ 데이터 보안! 보통 메타 데이터만 읽어옴

 

 

 

데이터 자산의 종류

테이블 (데이터베이스)

대시보드

문서/메세지 (슬랙, JIRA, Github, …)

ML 피쳐

데이터 파이프라인

사용자 (HR 시스템)

 

 

데이터 카탈로그 : 데이터 자산의 효율적인 관리 프레임웍

다양한 관점에서 데이터를 조직적으로 관리

비지니스/데이터 용어 vs. 태그

데이터 오너 (Business & Technical)

표준화된 문서 템플릿

 

 

일반적인 데이터 카탈로그 아키텍처 - Uber의 Databook 아키텍

 

 

데이터 카탈로그 주요 기능

주요 데이터 플랫폼 지원

비지니스 용어집 (Business Glossary)

주석/문서/태그 등 협업 기능

데이터 리니지

데이터 모니터링, 감사, 트레이싱

강력한 검색 기능 (통합 검색, NLP 검색)

데이터 추천 기능

데이터 유저 퍼소나 (예: 마케팅 분석가)

 

내용이 많아서 포스팅에는 담지 않음

 

 

데이터 거버넌스 관점에서 데이터 카탈로그의 중요성

● 우리가 갖고 있는 데이터 자산에 대한 통합 뷰를 제공

● 생산성 증대: 설문이나 데이터 티켓의 감소로 확인

● 위험 감소: 잘못된 결정과 개인정보등의 전파 방지

● 인프라 비용 감소: 불필요한 정보의 생성 방지와 안 쓰이는 데이터셋 삭제

● 데이터 티켓 감소

● 데이터 변경으로 인한 이슈 감소

    ▪ 컬럼 레벨 리니지와 CI/CD 프로세스 연동

 

 

데이터 카탈로그 이후 다음 스텝은?

자동화된 데이터 거버넌스 관련 웍플로우를 추가

 

일단 시작으로 품질 관련 경보 시스템 구현

ㄴ 중요 메타데이터 변경이나 데이터 품질 이슈 발생시 경보

ㄴ 내가 관심있는 데이터 자산의 오너 변경시 경보 (예: 매출 정의 변경)

 

데이터 관련 지표 리뷰 미팅 운영

 

 

 

 


공부하며 어려웠던 내용