์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- etl
- DataFrame Hint
- Salting
- Spark Partitioning
- AQE
- k8s
- Airflow
- Docker
- Spark
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
- off heap memory
- KDT_TIL
- spark executor memory
- colab
- Spark Caching
- disk spill
- Kafka
- Spark SQL
- backfill
- mysql
- SQL
- Kubernetes
- CI/CD
- topic
- redshift
- Spark ์ค์ต
- Dag
- aws
- Speculative Execution
- ๋น ๋ฐ์ดํฐ
- Today
- Total
JUST DO IT!
๊ฐ๋จํ DBT ์ค์ตํด๋ณด๊ธฐ (with Redshift) - TIL230622(2) ๋ณธ๋ฌธ
๐ KDT WEEK 12 DAY 4 TIL
- Data Build Tool (DBT)
- DBT ๊ฐ๋จํ ์ค์ต
๐ฅ Data Build Tool
ELT์ฉ ์คํ์์ค (In-warehouse data transformation)
๋ค์ํ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๋ฅผ ์ง์(Redshift, Snowflake, Bigquery...)
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋กค๋ฐฑ๋ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ๊ฐ ๋ฆฌ๋์ง ํ์ธ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ ํ์ง ํ ์คํธ ๋ฐ ์๋ฌ ๋ณด๊ณ
- ํ์คํ ๋ฆฌ ํ ์ด๋ธ๋ก ํ ์ด๋ธ ๋ณ๊ฒฝ ์ถ์
๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์์ DBT๋ฅผ ์ฌ๋ฆฌ๊ณ , DBT๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๊ธฐ ์ํด Airflow๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ผ๋ฐ์
๐ฆ DBT ๊ตฌ์ฑ ์ปดํฌ๋ํธ : ๋ฐ์ดํฐ ๋ชจ๋ธ(models), ๋ฐ์ดํฐ ํ์ง ๊ฒ์ฆ(tests), ์ค๋ ์ท(snapshots)
DBT ์ค์น(redshift)
pip3 install dbt-redshift # ์๋๋ฉด sudo
# ์ค์นํ
dbt init learn_dbt
dbt init ๊ณผ์ ์์ redshift ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
์ฐ๊ฒฐ ์๋ฃ ํ์๋ dbt init ๋ค์ ์ ๋ ฅํ ์ด๋ฆ์ผ๋ก ํด๋๊ฐ ํ๋ ์์ฑ๋๋ค.
์ฌ๊ธฐ์ ์์ฑ๋ dbt_project.yml์ ํ๊ฒฝ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
์ด ํ์ผ์ SQL์ ํตํด ์ ์ฅ๋๋ ๋ฐ์ดํฐ๊ฐ DB์ table์ด๋ view ๋ฑ์ผ๋ก ์ ์ฅ๋ ์ง ์ค์ ํ ์ ์๋ค.
์ด ๋ถ๋ถ์ ์๋์ Materialization ์ค๋ช ์์ ๋ค๋ฃฌ๋ค!
๐งฑ Model
ELT ํ ์ด๋ธ์ ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๋ณธ์ด ๋๋ ๋น๋ฉ ๋ธ๋ก (ํ ์ด๋ธ, ๋ทฐ, CTE)
models ํด๋์์ SQL ๋ฌธ์ ์์ฑํ์ฌ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๊ฒ ๋๋ค.
๋ณดํต ELT ๊ณผ์ ์ raw -> staging -> core ํํ๋ก ์งํ๋๋ค.
Input์ผ๋ก ์ ๋ ฅ(raw)์ ์ค๊ฐ(staging, src) ๋ฐ์ดํฐ๊ฐ ์ ์๋์ด,
Output์ผ๋ก ์ต์ข (core) ๋ฐ์ดํฐ๊ฐ ๋ํ๋๋ ํํ๋ก ์งํ๋๋ค.
๋ณดํต raw๋ CTE, staging View, core๋ Table๋ก ์ ์ฅ๋๋ค.
โ๏ธ Materialization
์ ๋ ฅ ๋ฐ์ดํฐ(ํ ์ด๋ธ)๋ค์ ์ฐ๊ฒฐํด์ ์๋ก์ด ๋ฐ์ดํฐ(ํ ์ด๋ธ)์ ์์ฑํ๋ ๊ฒ
ํ์ผ์ด๋ ํ๋ก์ ํธ ๋ ๋ฒจ์์ ๊ฐ๋ฅ
Materialization ์ข ๋ฅ : View, Table, Incremental(Table Appends), Ephemeral(CTE)
๋ฐ์ดํฐ ์ฌ์ฉ ์ฃผ๊ธฐ์ ์์ ์ ๋ฌด์ ๋ฐ๋ผ ์ข ๋ฅ๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๋๋ฐ, ์ด๋ dbt_project.yml์ ์์ฑํ๋ค.
model์ materialized format ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ
dbt_project.yml ๋ด์ฉ ์ผ๋ถ๋ฅผ ํธ์งํ๋ฉด ๋๋ค.
ex) example ํด๋ ๋ฐ์ ์๋ ํ ์ด๋ธ๋ค์ ๋ชจ๋ view๋ก ๋น๋
models:
learn_dbt:
# Config indicated by + and applies to all files under models/example/
example:
+materialized: view
ex) learn_dbt ํ๋ก์ ํธ์ ํ ์ด๋ธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก view ๋น๋ํ์ง๋ง, dim ํด๋ ๋ฐ์ผ๋ก๋ ๋ชจ๋ table๋ก ๋น๋
models:
learn_dbt:
+materialized: view
dim:
+materialized: talbe
๐ฆ ์ค์ต
1. INPUT ๋ง๋ค๊ธฐ
dbt_project.yml ์์ ํ์์๋ example์ +materialized ๋ถ๋ถ์ ์ญ์ ํ๊ณ example ํด๋๋ ์ญ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ src๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด models/src/ ์ sql ํ์ผ์ ๋ง๋ค์ด์ค๋ค.
๋ด Redshift์ raw_data ์คํค๋ง์ ์ ์ฅ๋ user_event, user_metadata, user_variant ๋ฐ์ดํฐ์ ํน์ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๊ฒ๋๋ค.
๊ฐ๊ฐ์ ํ ์ด๋ธ์ ๋ด์ฉ์ ์ด๋ ๋ค.
- user_event : ์ฌ์ฉ์์ ํ๋ ์ ๋ณด (๊ตฌ๋งค์ฌ๋ถ ๋ฑ)
- user_metadata : ์ฌ์ฉ์์ ์ ๋ณด ( ๋์ด, ์ฑ๋ณ ๋ฑ)
- user_variant : ๊ฐ ์ฌ์ฉ์์ AB ํ ์คํธ ๊ตฌ๋ถ (์ด๋ค ์ฌ์ฉ์๊ฐ A์ธ์ง, B์ธ์ง)
๊ทธ๋ฆฌ๊ณ dbt ๋ฃจํธ ํด๋์์ dbt run ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ๋ณด๋ฉด,
3๊ฐ์ ๋ชจ๋ธ์ ์ฐพ์ SQL์ ์คํํ๊ณ VIEW๋ฅผ ๋ง๋ค์๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๋ก์จ ์ธ ๊ฐ์ INPUT์ ๋ง๋ค๊ฒ ๋ ๊ฒ์ด๋ค.
2. OUTPUT ๋ง๋ค๊ธฐ
models ํด๋์ dim, fact ํด๋๋ฅผ ๊ฐ๊ฐ ์์ฑํ๊ณ , ์์ SQL ํ์ผ์ ๋ฃ๋๋ค.
dim์๋ Dimension ํ ์ด๋ธ์ด, fact์๋ Fact ํ ์ด๋ธ์ด ์์ฑ๋๋ SQLํ์ผ์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
- Fact ํ ์ด๋ธ : ๋งค์ถ ์์ต, ํ๋งค๋, ์ฌ์ฉ์์ ํ๋ ์ ๋ณด๊ฐ์ ๋ถ์์ ํ์ํ ๋ฉ์ธ ๋ฐ์ดํฐ ํ ์ด๋ธ
- Dimension ํ ์ด๋ธ : Fact ํ ์ด๋ธ์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ ์ด๋ธ ( ex. ์ฌ์ฉ์์ ๋์ด ๋ฑ)
๋ด ํ ์ด๋ธ์ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ํ๋์ ๋ด๊ณ ์๋ user_event ๊ฐ Fact ํ ์ด๋ธ์ด๋๊ณ , ๋๋จธ์ง๊ฐ Dimension ํ ์ด๋ธ์ด ๋๋ค.
Dimension ํ ์ด๋ธ์ ๊ฒฝ์ฐ src๋์ ๋น์ทํ๊ฒ ์์ฑํ๋ค.
WITH ์ ์ ์ฌ์ฉํ ref(ํ ์ด๋ธ์ด๋ฆ)์ ๋ด DB์ ์๋ ํด๋น ํ ์ด๋ธ์ ๊ฐ์ ธ์์ ์ฝ์ด์ฌ ์ ์๋ค.
fact ํ ์ด๋ธ์ ํด๋นํ๋ user_event์ ๊ฒฝ์ฐ Incremental (๋ฐ์ดํฐ ๋งค๋ฒ ๊ฐฑ์ ์ด ์๋ ๊ณ์ ์ฝ์ )ํ๊ฒ ๋ง๋ค์๋ค.
์ด๋ฅผ CTE ์์ ํ ํ๋ฆฟ ํ์์๋ค config๋ฅผ ์ฌ์ฉํ๋ค.
on_schema_change๋ ํด๋น ํ ์ด๋ธ์ ์คํค๋ง๊ฐ ๋ฐ๋์์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ค์ ํ๋ค.
'fail'์ ๊ฒฝ์ฐ ๊น๋ํ๊ฒ ์คํจํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Incrementalํ๊ฒ ๋์ํ๊ธฐ ์ํด WHERE๋ฌธ์ ํตํด datestamp๊ฐ ๊ฐ์ฅ ์ต๊ทผ์ธ ๋ฐ์ดํฐ์ ํํด์๋ง Insert๋ฅผ ์ํํ๋๋ก ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธ์ ์์ฑํ ๋๋ WHERE์ ํฌํจํ์ง ์๊ณ ํ๋ฒ ์คํํ๋ค๊ฐ WHERE์ ์ ๋ฃ๊ณ ์คํํ๋๋ฐ,
๋ด ์๊ฐ์ WHERE์ ์ด ํฌํจ๋ ์ํ๋ก ์ฒ์ ์คํํ๋ฉด fact_user_event ํ ์ด๋ธ์ ๋ด์ฉ์ด ์๋ด๊ธธ๊ฒ๊ฐ๋ค..
๊ทธ๋ฌ๋ ์ต์ด ์คํํ ๋๋ WHERE์ ์์ด ํ๋ฒ ์คํํด์ผ ๋์ง ์์๊น?
๊ทธ๋ฆฌ๊ณ dbt_project.yml ํ์ผ์์ ๊ธฐ๋ณธ ์์ฑํ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ์ฃผ์๋ค.
์ด๋ก์จ ๊ธฐ๋ณธ ์์ฑํ์ view, dim ํด๋ ๋ฐ์ผ๋ก๋ table๋ก ์์ฑํ๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก ์ ์ด๋ฏธ์ง์ฒ๋ผ ์ฃผ์์ผ๋ก ํ๊ธ์ ๋ฌ์๋๋ฉด dbt compileํ ๋ ์ธ์ฝ๋ฉ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋คใ
๊ทธ๋์ ์ด๋ฏธ์ง๋ง ์์ฑํ๊ณ ์ฃผ์์ ๋ฐ๋ก ์ง์ ๋คใ
dbt_project.yml ํธ์ง๊น์ง ๋๋๋ฉด dbt run์ ์คํํด๋ณด์.
fact์ dim์ table๋ก, src์์๋ view๋ก ์์ฑ๋์๋ค. (incremental๋ table)
์ ์์ฑ๋์๋์ง Colab์์ ํ์ธํด๋ณด๋, ์์ฑ๋ view์ table์ ํ์ธํ ์ ์์๋ค.
3. analytics ํด๋ณด๊ธฐ
dim์ ๋ ํ ์ด๋ธ์ ์กฐ์ธํ user ํ ์ด๋ธ์ ๋ง๋ค์ด๋ณด์.
์ฌ์ค JOIN๋ง ๋ค์ด๊ฐ์ ๋ฟ, ์๊น dim ํด๋์ SQL์ ๋ง๋๋ ๊ณผ์ ๊ณผ ๋๊ฐ๋ค.
์ด์ธ์ analytics๋ ์์์ ์์ฑํ ๊ฒ์ฒ๋ผ ์์ ๋กญ๊ฒ ์ ์ฅํ ํ ์ด๋ธ์ ๋ถ๋ฌ์์ SQL๋ฌธ์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋๋ค!
++ ๊ณ ์น ๋ถ๋ถ
src ํด๋์ SQL์ ๊ฒฝ์ฐ ๊ผญ View์ผ ํ์์์ด CTE๋ก ์ถฉ๋ถํ๋ค๊ณ ํ๋ค.
dbt_project.yml์ ๊ฐ๋จํ ์์ ํ๊ธฐ๋ง ํ๋ฉด ๋๋ ์ผ์ด๋ค!