dbt를 적용한 데이터마트 작업중 정리한 내용들
dbt란
•
dbt(data-build-tool)는 데이터 변환(Transform)을 SQL 기반으로 선언적으로 관리하는 도구
•
SQL 모델을 코드로 버전 관리하고, 모델 간 의존성, 테스트 자동화, 문서 자동 생성등 체계적 관리 가능
•
Jinja 템플릿 기반 동적 SQL 구성으로 T(Transform) 역할을 담당
왜 필요할까?
•
SQL 기반의 데이터 흐름이 비정형적으로 계속 증가하면서 의존 관계 파악이 어려워짐
•
동일한 조인/전처리 로직이 여러 곳에 복붙되며 쿼리 중복과 비효율적인 실행이 매우 많음
•
BI 환경에서 대규모 SQL이 24시간 끊임없이 돌면서 서버 리소스(메모리·CPU)가 한계치에 근접
◦
태블로 Prep 서버가 EC2 8xlarge임에도 메모리 리밋 근접
•
SQL 변경이 들어올 때 전체 영향도 파악이 어려워 수정 리스크가 커짐
→ 이런 문제 해결을 위해 점차적으로 dbt로 데이터 변환 파이프라인을 대체할 예정
dbt 기능들
모델
•
SQL 파일 단위 관리
models/
└─ stg_order.sql
└─ fact_order_product.sql
└─ dim_product.sql
Plain Text
복사
의존성 관리
•
SQL 안에서 {{ ref(’model_name’) }} 사용해 해당 모델이 어떤 모델 기반으로 만드는지 자동 추적
select *
from {{ ref('stg_order') }}
SQL
복사
문서화
•
테이블간 lineage, 컬럼 설명, 테스트 결과 등 자동 생성
예시 이미지
데이터 품질 테스트
•
unique, not_null, accept_value 등 테스트 수행
•
커스텀 테스트도 작성 가능
columns:
- name: order_id
tests:
- unique
- not_null
SQL
복사
Jinja 템플릿
•
반복문, 조건문, 변수, 매크로 등을 통해 동적 SQL을 생성 가능
select
id,
{{ dbt_utils.generate_surrogate_key(['email', 'created_at']) }} as user
from raw_users
SQL
복사
dbt 리소스
•
macros/:
◦
재사용 가능한 Jinja 매크로 함수 정의하는 곳
◦
반복적인 쿼리 로직, 동적 SQL 생성 등
•
seed/: CSV 같은 정적 데이터를 db에 로드할 때 사용
•
snapshots/:
◦
원본 테이블의 변경 이력을 시간 단위로 저장하는 기능
◦
주로 코드북, 매핑 테이블, 기준 테이블 등에 활용
◦
dbt seed 실행 시 데이터베이스에 로드됨
•
models/:
◦
실제 SQL 모델 파일들이 위치
◦
dbt run시 실행되어 테이블/뷰로 변환됨
•
target/:
◦
dbt 실행 결과물이 저장되는 폴더
◦
manifest.json, run_results.json 등이 들어 있음
◦
Airflow, DataHub, Lineage 추적 등에 이 파일 사용
•
tests/: 스키마 및 데이터 품질 테스트 SQL 또는 YAML 정의 저장소.
•
analyses/: 운영 모델과 분리된 adhoc SQL 분석 파일 저장 목적
•
logs/: 실행 시 생성된 로그
Table Materialization 유형
•
table:
◦
CREATE TABLE AS(CTA) 문을 통해 모델을 테이블로 재생성
◦
쿼리 성능 우수하지만 복잡한 변환의 경우 재생성에 시간 소요
◦
fact 보다 dim 유형의 테이블에 주로 사용
•
view:
◦
CREATE VIEW 문을 통해 모델을 뷰로 재 생성
◦
추가적인 데이터 저장 없이 항상 최신 데이터 반영
•
incremental:
◦
이전 실행 이후 변경되거나 추가된 데이터만 삽입/업데이트, unique_key 지정 필요
◦
incremental_strategy
▪
append - 증분해야하는 행들 기존 테이블에 단순 추가
▪
merge - 아테나는 파일기반으로 upsert가 안되서 지원안함
•
증분해야하는 행들을 기존 테이블과 비교해 특정 컬럼의 값만 업데이트 하는 방식
•
중복 행 생성을 차단하지만 기존 테이블과 일일히 비교해야해서 속도가 느려짐
▪
insert overwrite
•
아테나에서 특정 파티션 단위로 수행
•
기존 파티션을 재적재하기 때문에 중복 없음
{{ config(
materialized='incremental',
incremental_strategy='insert_overwrite',
partition_by=['year', 'month', 'day']
) }}
SQL
복사
•
materialized view:
◦
데이터베이스에 물리적으로 저장된 뷰
◦
쿼리 성능 우수 데이터의 최신성을 유지
◦
dbt-athena-adapter는 현재 미지원
profiles.yml 주요 파라미터(아테나 기준)
필드 | 설명 | 예시 |
type | 사용 데이터베이스 어댑터 | athena, snowflake, bigquery 등 |
database | 카탈로그 명 | awsdatacatalog (Athena 고정) |
schema | Glue Database 명 (dbt schema와 동일) | bronze, silver, gold |
s3_staging_dir | 쿼리 결과 저장용 버킷 | s3://data-lake/staging |
threads | 동시 실행 쓰레드 수 | 아테나 어댑터는 모델 하나당 쿼리 하나이므로 동시에 돌릴 아테나 쿼리수와 같음
아테나는 기본 계정당 20개의 쿼리 동시 실행 가능 |
region_name | AWS 리전 | ap-northeast-2 |
dbt 주요 명령어 정리
명령어 | 역할 | 설명 |
dbt run | 모델 실행 | 모델 SQL → 테이블/뷰 생성 |
dbt build | 전체 실행 | run + test + snapshot + seed 일괄 수행 (권장) |
dbt parse | 구문 검증 | Jinja 파싱만 수행, DB 쿼리 실행 없음 |
dbt compile | SQL 렌더링 | 변환된 실제 SQL을 /target/compiled/에 저장 |
dbt test | 품질 테스트 | unique, not_null, relationships 등 실행 |
dbt seed | CSV 로드 | seeds/의 csv 로드 |
dbt snapshot | 변경 이력 저장 | snapshot 정의 기반으로 SCD2(Slowly Changing Dimension) 테이블 생성 |
dbt clean | 캐시 삭제 | target/, dbt_packages/ 삭제 |
dbt deps | 패키지 설치 | packages.yml 기반 외부 패키지 다운로드 |
dbt run-operation | 매크로 단독 실행 | ETL 관리용 커스텀 작업에 사용 |
dbt docs generate | 문서 생성 | manifest, catalog 생성 |
dbt docs serve | 문서 UI 실행 | 로컬 웹 lineage UI 제공 |
dbt debug | 환경 검사 | 프로필, credential, DB 연결 체크 |
