들어가며
데이터 업무하다 보면 마주하는 케이스
(1) A님 갑자기 제 배치가 안돌아요
- 아 alpha_omega 테이블 참조하셨죠? 그거 오늘부터 alpha_beta로 적재됩니다~
(2) 뭐야 휴지는 없어도 휴지심은 있어야 되는데? (갑작스러운 null 출현)
dbt공홈 문서를 보다보면 유독 자주 등장하는 단어가 있다. “software engineering” 한발 더 나아가서
data analysts should adapt similar practices and tools to software developoers
이렇게 까지..! 얘기를 한다. 물론, 분석하기도 바쁜 상황이지만.. dbt를 사용하면
- Version Control - Analytic code는 반드시 버전 관리를 해야 함, 비즈니스 요구 사항이나 데이터가 바뀌었을 때, 누가 언제 무엇을 바꾸었는지를 알 수 있게!
- Quality Assurance - 리뷰와 테스트를 통한 데이터 퀄리티 보장!
- Documentation - 분석 또한 하나의 소프트웨어 앱 처럼 생각해봐라. 문서화가 잘 되어 있으면 당연히 잘 사용하지 않겠는가?
- Modularity - Copy Paste는 좋은 방식이 아님. 같은 인풋을 넣었을 때 동일한 결과를 보증하고, 비즈니스 로직이 변했을 때 스키마나 데이터 셋에 그 변화가 자동으로 반영되도록 모듈화가 필요!
뭐 이런 이점들이 있다고 하고..! 회사에서도 도입을 준비중이어서 이것 저것 공부해보는 중이다. 오늘은 그 첫 번째 시간으로 DBT 프로젝트를 가볍게 빌드해보고 bigquery에 연결해보는 것 까지 해보고자 한다.
일단, 기본적으로 dbt에는 dbt-cloud와 dbt-core 2가지 버전이 있다. dbt-cloud는 별도 사용료를 내야 이용할 수 있는 클라우드 버전의 DBT이고 본 글에서 사용하는 버전은 dbt-core는 오픈소스이다.
DBT 라이브러리 설치를 하기 전에...
오늘 하게 될 과정들을 이해하려면 DBT 프로젝트 폴더 구조가 어떻게 생겼는지, 어느 정도는 알고 있어야 한다.
Jaffle_shop-classic dbt에서 sample로 만들어둔 프로젝트이다. README에 해당 repo를 더 이상 관리하고 있지 않다고 적혀있지만, 나 같은 초보자 입장에서 dbt 프로젝트의 구조를 파악하기에는 딱 적당한 것 같다.
여기서는 dbt_project.yml과 models폴더 두 부분만 짚고 넘어가겠다.
DBT폴더 구조 기본 개요
dbt_project.yml
name: 'jaffle_shop' config-version: 2 version: '0.1' profile: 'jaffle_shop' model-paths: ["models"] models: jaffle_shop: materialized: table staging: materialized: view
dbt_project.yml은 dbt 프로젝트를 어떻게 운영할지에 대한 yml파일이다. 예를 들어, model-paths: ["models"]는 model이라는 작업 결과물(아직 이 개념을 정확히 다루지 않아서 헷갈릴 수 있다.)을 models라는 폴더에 저장하겠다는 뜻이다.
그리고, 하단부에 materialized는 dbt 명령어 실행 후 생성된 결과를 어떤 형태로 저장할지를 지정하는 것이다. dbt_project.yml에 어떤 키워드들이 들어갈 수 있는지는 여기서 더 자세히 살펴볼 수 있지만, DB연결 한번 해보지 않은 상황에서 이 문서를 이해하기는 굉장히 어렵다.
우선은 dbt_project.yml은 dbt 프로젝트 운영 정책 관련된 파라미터를 설정하는 파일 이정도로만 이해하고 넘어가자.
models
models폴더를 이해하려면 model이라는 개념에 대해서 알고 있어야 한다.
Models are where your developers spend most of their time within a dbt environment. Models are primarily written as a select statement and saved as a .sql file
음...? SELECT * FROM ... ? 그래 바로 그거다. SELECT * FROM ....으로 구현되는 결과물 그것이 model이고 models는 그것들을 저장해 둘 수 있는 폴더이다.
다만, models의 예시 파일은 우리가 그동안 알던 sql이랑은 다소 다른 문법으로 적혀져 있다.
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
with orders as (
select * from {{ ref('stg_orders') }}
),
payments as (
select * from {{ ref('stg_payments') }}
),
order_payments as (
select
order_id,
{% for payment_method in payment_methods -%}
sum(case when payment_method = '{{ payment_method }}' then amount else 0 end) as {{ payment_method }}_amount,
{% endfor -%}
sum(amount) as total_amount
from payments
group by order_id
),
여기서 {% %} jinja-template문법으로 리스트 변수를 만들거나, for loop를 돌리거나, if-else 조건문 등을 다루는 구문이다.
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
{% for payment_method in payment_methods -%}
sum(case when payment_method = '{{ payment_method }}' then amount else 0 end) as {{ payment_method }}_amount,
{% endfor -%}
위 예시는 선언된 payment_method 리스트 안의 변수들에 대해 for-loop를 도는 과정이다. 지금 이걸 다 알 필요는 없을 것 같다. model에서 정의하는 sql은 jinja-template과 조합하여 sql안에서도 좀 더 다양한 기능들을 사용할 수 있게 한다 정도로 이해하면 될 것 같다.
DBT 라이브러리 설치
를 하기 전에, DBT 프로젝트 폴더를 우선 만들어두자. 나는 first_dbt라는 깡통 폴더를 만들어두고 로컬에 클론을 해두었다. git clone https://~
dbt core를 설치하는 방법은 여러가지가 있는데, 나는 그 중 가장 쉬운 pip를 이용하여 설치할 것이다.
python -m venv dbt-env # create the environment
source dbt-env/bin/activate # activate the environment for Mac and Linux OR
우선 가이드에 나오는 것처럼 가상환경을 먼저 만들고 실행하자. 그런 다음, 라이브러리를 인스톨하면 된다.
python -m pip install dbt-core dbt-ADAPTER_NAME
dbt의 핵심적인 기능을 다룬 dbt-core와 다른 DATA-WAREHOUSE들과 연결해줄 수 있는 adapter라이브러리를 같이 설치해준다. 원래는 adapter라이브러리를 설치하면 core도 자동으로 설치되었지만, 1.8버전부터는 dbt-core도 별도로 설치해주어야 한다고 한다.
우리는 bigquery와 연결해서 사용할 것이니 아래와 같이 설치해주자.
python -m pip install dbt-core dbt-bigquery
여기까지, 설치를 완료하고 터미널에서 dbt --version을 실행해보자. 이렇게 나온다면 정상적으로 라이브러리가 설치된 것이다.
profiles.yml 작성
다음으로, dbt-profile을 빌드해야 한다. 근데, 이건 앞서 설명한 dbt_project.yml과 비슷하면서도 또 다른 파일이다.
이게 진짜 뭥미하면서 좀 헷갈릴 수 있는데, 우리가 터미널에서 dbt를 실행시키면 dbt는 두 가지 yml파일을 파싱한다. 하나는 아까 얘기한 dbt_project.yml이고, 다른 하나는 profiles.yml이다.
- dbt_project.yml은 앞서 말한 것처럼 dbt를 내가 앞으로 요로코롬~ 운영할 것이다.와 관련된 yml파일이고
- profiles.yml은 DW와 어떻게 연결할지를 설정하는 파일이다.
결국 둘 다 만들어야 하는데, profiles.yml의 파일 위치가 초큼 특이하다.
dbt will search the current working directory for the profiles.yml file and will default to the ~/.dbt/ directory if not found.
~/.dbt가 default경로이다. 아래와 같이 default경로를 별도로 설정해줄 수도 있지만.. test하는건데 굳이?
export DBT_PROFILES_DIR=path/to/directory
이제 우리도 폴더와 profiles.yml을 생성해주자.
mkdir ~/.dbit
touch ~/.dbt/profiles.yml
근데, 이 profile은 또 뭘 보고 적는담.. 다행히도 dbt-labs에서 sample로 만들어둔 profile파일이 있다.
우리는 빅쿼리 json 키파일을 이용해서 빅쿼리와 연결할 것이므로 아래의 target-name-2 버전으로 작성해줄 것이다.
geultto: # project 명을 적어준다. target: bigquery # 기본으로 사용할 타겟 DW outputs: # DW가 여러개일 수 있음, DEV/PROD같은 이름으로 적기도 bigquery: # DW명 type: bigquery # 연결 타입 method: service-account # 연결 방식 project: geultto # 프로젝트 명, **나중에 dbt_project.yml과 동일하게 작성** dataset: first_dbt # 빅쿼리의 데이터 세트 이름 threads: 4 # dbt 프로젝트 run시 사용하는 쓰레드 수 keyfile: /Users/../key.json # GCP 키 파일 경로
요로코롬 적어주면.. profiles 작성 완료다.
dbt_project.yml 작성
자 이제, DBT 프로젝트 폴더로 이동하자.
여기서 models폴더를 생성해주고
mkdir models
dbt_project.yml파일을 생성해준다.
name: 'geultto' # 반드시 profiles.yml의 profile-name과 일치해야 한다. config-version: 2 version: '0.1' profile: 'geultto' model-paths: ["models"] # 모델 폴더 경로 models: geultto: materialized: view # 결과물을 view로 구현하겠다는 뜻
그런 다음, 위와 같이 yml파일을 작성해주면 된다. 이제 터미널에서 아래와 같이 debug명령어를 실행하고
dbt debug
All checks passed 표시가 나오면 성공이다! 정상적으로 dbt와 빅쿼리가 연결된 것이다.
'딥상어동의 딥한 프로그래밍 > 엔지니어링' 카테고리의 다른 글
Airflow DAG 개념 톺아보기 (설치/실행 과정 포함) (4) | 2024.10.13 |
---|---|
우당탕탕 슬랙 메시지 저장기(2) - 게시글과 쓰레드 조회하기 (2) | 2023.05.21 |
우당탕탕 슬랙 메시지 저장기(1) - 슬랙 메시지 넌 누구냐? (8) | 2023.05.07 |
데이터 마트에서는 뭘 파나요?(feat. OLTP, OLAP) (14) | 2023.03.26 |
[Bigquery] 지난 며칠 간 Python과 연동하여 사용한 소감 (0) | 2023.01.18 |
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!