Day 41 Data pipeline

๐Ÿ“‹ย ๊ณต๋ถ€ ๋‚ด์šฉ

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

Data๋ฅผ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ชฉ์ ์ง€๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…

  • (Write code using)Python, Scalar
  • SQL Query(DW or DL -> DW)
  • ๋ชฉ์ ์ง€ : (๋Œ€๋ถ€๋ถ„)DATA WAREHOUSE

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ๊ตฌ์„ฑ

Alt text

1
๋ฐ์ดํ„ฐ ์†Œ์Šค --(๋‹ค์ˆ˜์˜ ETL)--> ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค --> ๋Œ€์‹œ๋ณด๋“œ

๋‹ค์ˆ˜์˜ ETL๋“ค ๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(=Airflow)๊ฐ€ ํ•„์š”ํ•ด์ง

ETL

Extract, Transform and Load

  • Date Pipeline, ETL, Data Workflow, DAG(in Airflow)

ETL vs. ELT

์šฉ์–ด์„ค๋ช… ๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„
ETL๋ฐ์ดํ„ฐ์†Œ์Šค -> ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด
ELT๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค(or ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ) ๋‚ด๋ถ€, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€

ELT ํ”„๋กœ์„ธ์Šค

  • SQL CTAS
  • dbt : Data Build Tool (Done by Analytics Engineering)

Data Lake vs. Data Warehouse

๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ (Data Lake)

  • ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋ณด๋‹ค ๋ช‡๋ฐฐ ๋” ํฐ ํฌ๊ธฐ์˜ ์ €์žฅ์†Œ
  • ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ + ๋น„๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ
  • ๋ณด์กด ๊ธฐํ•œ์ด ์—†๋Š”, ๋ฐ์ดํ„ฐ๋ฅผ ์›๋ณธ์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ €์žฅ์†Œ

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค (Data Warehouse)

  • ๋ณด์กด ๊ธฐํ•œ์ด ์žˆ๋Š”, ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ
  • ์‹œ๊ฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” BIํˆด์˜ ๋ฐฑ์—”๋“œ๋กœ ์—ฐ๊ฒฐ

Data Lake & ELT

Data Sources->Data Lake
(S3, GCS,..)
->Data Transforms
(Spark, Athena,..)
->Data Warehouse
(==Data Mart)
  • Data Lake์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ Data Warehouse์— ์ ์žฌํ•˜๋Š” ๊ณผ์ •๋„ ELT

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ข…๋ฅ˜

Raw Data ETL Jobs (ETL)

  • By Data Engineer
  1. ์™ธ๋ถ€์™€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ฝ์–ด
  2. ๋ฐ์ดํ„ฐ ํฌ๋งท ๋ณ€ํ™˜ ํ›„ (๋ฐ์ดํ„ฐ๊ฐ€ ์ปค์ง€๋ฉด Spark ๋“ฑ ํ™œ์šฉ)
  3. ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์— ๋กœ๋“œ

Summary / Report Jobs (ELT)

  • By Data Analyst

  • Analytics Engineer (DBT Tool)

  • DW or DL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋‹ค์‹œ DW์— ์“ฐ๋Š” ๊ณผ์ •

  • Raw Data๋ฅผ ์ฝ๊ณ  ์ผ์ข…์˜ ๋ฆฌํฌํŠธ๋‚˜ ์จ๋จธ๋ฆฌ ํ˜•ํƒœ์˜ ์ •์ œ๋œ ํ…Œ์ด๋ธ”์„ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ์šฉ๋„

  • ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ : AB ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

Production Data Jobs

  • DW์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋‹ค๋ฅธ Storage์— ์“ฐ๋Š” ๊ณผ์ • (๋ฐ์ดํ„ฐ ๋ชฉ์ ์ง€๊ฐ€ ์™ธ๋ถ€ Storage)

  • ์ผ๋ฐ˜์ ์ธ ํƒ€๊ฒŸ ์Šคํ† ๋ฆฌ์ง€

    • Cassandra/HBase/DynamoDB ๋“ฑ๊ณผ ๊ฐ™์€ NoSQL (ML๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ํŠน์ • ํ”ผ์ณ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ)
    • MySQL๊ณผ ๊ฐ™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(OLTP, Production DB)
    • Redis, Memcache์™€ ๊ฐ™์€ ์บ์‹œ
    • ElasticSearch์™€ ๊ฐ™์€ ๊ฒ€์ƒ‰์—”์ง„

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ๋•Œ ๊ณ ๋ คํ•  ์ 

์šด์˜ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค

  • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹คํŒจ
    • ๋ฒ„๊ทธ :<
    • ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋ฌธ์ œ
      • ex: ๋ฐ์ดํ„ฐ ํฌ๋งท ๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด?
    • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ๋“ค ๊ฐ„ ์˜์กด๋„์— ๋Œ€ํ•œ ์ดํ•ด ๋ถ€์กฑ
      • ํŠน์ • ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ์ปฌ๋Ÿผ์„ ๋“œ๋ž ํ•˜๋Š” ๋“ฑ ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์—ฌ๊ธฐ์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
  • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ฆ๊ฐ€ -> ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€
    • ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‚ฌ์ด์— ์˜์กด๋„๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋”์šฑ ๋ณต์žกํ•ด์ง
      • ex: ๋งˆ์ผ€ํŒ… ์ฑ„๋„ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ด€๋ จ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Œ
    • ๋” ๋งŽ์€ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌํ•ด์•ผํ•จ

Best Practices

  1. Full Refresh
  • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋งค๋ฒˆ ํ†ต์งธ๋กœ ์ „๋ถ€ ๋ณต์‚ฌํ•ด์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ
  • Incremental Update๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด?
    • Incremental Update : ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜, ์—…๋ฐ์ดํŠธ ๋œ ๋ ˆ์ฝ”๋“œ๋“ค๋งŒ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ์‹
    • full refresh ํ•  ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์ด ์žˆ๋Š”๊ฐ€?
    • ํŠน์ • ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ๋œ ๋ ˆ์ฝ”๋“œ๋งŒ ์ง€์ •ํ•ด์„œ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  1. ๋ฉฑ๋“ฑ์„ฑ(Idempotency) ๋ณด์žฅ
  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋Œ€ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ์ตœ์ข… ํ…Œ์ด๋ธ” ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์•„์•ผ ํ•จ
    • ex: ์ค‘๋ณต ๋ฐ์ดํ„ฐ X
  • ๋ฉฑ๋“ฑ์„ฑ์ด ๊นจ์งˆ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ์‹คํŒจ๋ฅผ ํ•˜๋”๋ผ๋„ ๋ฉฑ๋“ฑ์„ฑ์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ๊น”๋”ํ•˜๊ฒŒ ์‹คํŒจํ•ด์•ผ ํ•จ
  • ์ค‘์š” ํฌ์ธํŠธ : critical point๋“ค์ด ํ•˜๋‚˜์˜ atomic action์œผ๋กœ ์‹คํ–‰์ด ๋˜์–ด์•ผ ํ•จ (๋‹ค๊ฐ™์ด ์„ฑ๊ณต, ๋‹ค๊ฐ™์ด ์‹คํŒจ)
    • SQL transaction
  1. Backfill
  • ์‹คํŒจํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์ด ์‰ฌ์›Œ์•ผ ํ•จ
  • full refresh : backfill์ด ์‰ฌ์›€
  • Airflow: backfill
  1. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ž…๋ ฅ, ์ถœ๋ ฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•˜๊ธฐ
  • ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋„ˆ, ํ…Œํฌ๋‹ˆ์ปฌ ์˜ค๋„ˆ ๋ช…์‹œํ•˜์—ฌ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ธฐ๊ธฐ
    • ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋„ˆ : ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ ์‚ฌ๋žŒ
  • ๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ
  • ๋ฐ์ดํ„ฐ ๋””์Šค์ปค๋ฒ„๋ฆฌ
  • ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ(๋ฐ์ดํ„ฐ ๋ฆฌ๋‹ˆ์ง€)๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ํ•„์š”
  1. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œ
  • ํ…Œ์ด๋ธ”์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธ
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์„ ์ฐพ๊ณ , ์ด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ญ์ œ
  1. ์‚ฌ๊ณ  ๋ฆฌํฌํŠธ(post-mortem report) ์ž‘์„ฑํ•˜๊ธฐ
  • ๋™์ผํ•œ, ๋น„์Šทํ•œ ์‚ฌ๊ณ ๊ฐ€ ์žฌ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • ์‚ฌ๊ณ  ์›์ธ์„ ์ดํ•ดํ•˜๊ณ , ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•ก์…˜ ์•„์ดํ…œ์ด ์ค‘์š”
  • ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ •๋„๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š” ๋ฐ”๋กœ๋ฏธํ„ฐ
  1. ์ค‘์š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ฒดํฌ
  • ์ž…๋ ฅ ๋ ˆ์ฝ”๋“œ ์ˆ˜, ์ถœ๋ ฅ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ฒดํฌ
  • ์จ๋จธ๋ฆฌ ํ…Œ์ด๋ธ” ์ž‘์„ฑ, primary key uniqueness ๋ณด์žฅ ์—ฌ๋ถ€ ์ฒดํฌ
  • ์ค‘๋ณต ๋ ˆ์ฝ”๋“œ ์ฒดํฌ

ETL ์ž‘์„ฑ ์‹ค์Šต

  • #TODO

Airflow

์†Œ๊ฐœ

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋ ˆ์ž„์›Œํฌ

๊ตฌ์„ฑ ์„ค๋ช…

๐Ÿ‘€ย CHECK

(์–ด๋ ต๊ฑฐ๋‚˜ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ ๋“ฑ ๋‹ค์‹œ ํ™•์ธํ•  ๊ฒƒ๋“ค)

โ— ๋Š๋‚€ ์ 

Licensed under CC BY-NC-SA 4.0
Hugo๋กœ ๋งŒ๋“ฆ
Jimmy์˜ Stack ํ…Œ๋งˆ ์‚ฌ์šฉ ์ค‘