โœจ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ํ•€ํ…Œํฌ ํšŒ์‚ฌ๋ฅผ ๊ฐ€์ •ํ•ด, ์นด๋“œ์‚ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ง‘๊ณ„ โ†’ ์ •์ œ โ†’ ๋ถ„์„ํ•˜๋Š” ๋ฐฐ์น˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด๋ณด์•˜๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์—ˆ๊ธฐ์— Faker๋ฅผ ํ™œ์šฉํ•ด ๊ฐ€์ƒ์˜ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ „์ฒด์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์—๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

๐ŸŽฏ ๋ชฉํ‘œ

โ€œAirflow๋ฅผ ํ™œ์šฉํ•ด ํ˜„์‹ค์ ์ธ ๊ธˆ์œต ๋ฐ์ดํ„ฐ๋ฅผ Spark๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ €์žฅ ๋ฐ ๋ถ„์„๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ์ž๋™ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค์–ด๋ณด์ž.โ€

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

๋‹จ๊ณ„ ์„ค๋ช… ์ž‘์—…
๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์›์‹œ ๋ฐ์ดํ„ฐ ์ค€๋น„ Faker๋กœ ์‹ ์šฉ์นด๋“œ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์ €์žฅ ์œ„์น˜๋กœ ์ด๋™ S3์— ์—…๋กœ๋“œ (raw)
๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ •์ œ, ์ง‘๊ณ„ PySpark๋กœ ์ง€์—ญ๋ณ„ ๊ฑฐ๋ž˜๊ธˆ์•ก ์ง‘๊ณ„
๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๊ณต ํ›„ ์ €์žฅ S3์— Parquet ์ €์žฅ (processed)
๋ฐ์ดํ„ฐ ๋ถ„์„ ์ฟผ๋ฆฌ์šฉ ๊ตฌ์กฐ ๊ตฌ์„ฑ Athena๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ SQL ๊ฐ€๋Šฅ
์ž๋™ํ™” ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ • Airflow๋กœ DAG ์ž‘์„ฑ

๐Ÿ”ง ๊ธฐ์ˆ  ์Šคํƒ

  • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜: Apache Airflow
  • ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ: Python, Faker
  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: Apache Spark (PySpark)
  • ๋ฐ์ดํ„ฐ ์ €์žฅ: AWS S3
  • ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ: AWS Athena
  • ์ธํ”„๋ผ: Docker, Terraform

๐Ÿงฉ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ

๊ฐ€์ƒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ โ†’ S3 ์—…๋กœ๋“œ โ†’ Spark ๋ณ€ํ™˜ โ†’ S3 ์ €์žฅ โ†’ Athena๋กœ ์ฟผ๋ฆฌ
  1. Python์˜ Faker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฐ€์ƒ์˜ ์‹ ์šฉ์นด๋“œ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ CSV ์ƒ์„ฑ

  2. ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ S3 ์—…๋กœ๋“œ

  3. PySpark๋กœ ์ง€์—ญ๋ณ„ ์ง‘๊ณ„, ๋ณ€ํ™˜

  4. ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ .parquet ํฌ๋งท์œผ๋กœ AWS S3์— ์ €์žฅ

  5. Athena์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑํ•˜์—ฌ SQL ๋ถ„์„ ๊ฐ€๋Šฅ

  6. Airflow DAG๋กœ ์ „์ฒด ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜

๐Ÿ’ข ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๊ณผ ์‚ฝ์งˆ์˜ ๊ธฐ์–ต

  1. ์—์–ดํ”Œ๋กœ์šฐ DAG๊ฐ€ ์•ˆ๋‚˜์˜ด, ํ์—์„œ ๋ฉˆ์ถค
  • ์›์ธ: ์—์–ดํ”Œ๋กœ์šฐ scheduler ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์Œ
  • ํ•ด๊ฒฐ: ๋ณ„๋„์˜ scheduler service ๋ฅผ docker-compose.yml ์— ์ถ”๊ฐ€
  1. ์—์–ดํ”Œ๋กœ์šฐ์—์„œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๊ฐ€ ์•ˆ๋‚˜์˜ด
  • ์›์ธ: ์ปจ๋ฐ์ด๋„ˆ์— faker, boto3, pyspark ์„ค์น˜๋˜์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ: ์ปค์Šคํ…€ Dockerfile.airflow ๋งŒ๋“ค๊ณ  ์•ˆ์— pip install -r requirements.txt ์ถ”๊ฐ€. docker-compose.yml ์—์„œ image: ๋ง๊ณ  build:๋กœ ์ด ์ปค์Šคํ…€ ๋นŒ๋“œ ์‚ฌ์šฉ.
  1. ์—์–ดํ”Œ๋กœ์šฐ ์‹คํŒจ Variable AWS_ACCESS_KEY_ID Does Not Exist
  • ์›์ธ: {{ var.value.AWS_ACCESS_KEY_ID }} ์„ธํŒ…์ด ์•ˆ๋˜์—ˆ์Œ
  • ํ•ด๊ฒฐ: ์—์–ดํ”Œ๋กœ์šฐUI์—์„œ Admin -> Variables ์ถ”๊ฐ€
  1. S3 โ€œFile Not Foundโ€
  • ์›์ธ: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํด๋”์— ์ €์žฅ ์‹œ๋„, ํŒŒ์ผ ๊ฒฝ๋กœ ๋ถˆ์ผ์น˜
  • ํ•ด๊ฒฐ: ์ปจํ…Œ์ด๋„ˆ๋“ค ์‚ฌ์ด์— ํŒŒ์ผ ๊ฒฝ๋กœ ํ†ต์ผ, ํด๋” ์ƒ์„ฑ ํ›„ ์ €์žฅ
  1. DockerOperator โ€œCannot Connect to Docker Daemonโ€
  • ์›์ธ: ๋„์ปค ์†Œ์ผ“์ด ์—์–ดํ”Œ๋กœ์šฐ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ ์•ˆ๋จ
  • ํ•ด๊ฒฐ: airflow-webserver service volumns ์— ์•„๋ž˜ ์ถ”๊ฐ€
- /var/run/docker.sock:/var/run/docker.sock
  1. DockerOperator Mount Error: โ€œCannot unmarshal string into Go structโ€
  • ์›์ธ: mount ํ• ๋•Œ docker.types.Mount ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
  • ํ•ด๊ฒฐ: Mount ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์‚ฌ์šฉ
from docker.types import Mount

mounts=[Mount(source="/host/path", target="/container/path", type="bind")]

โœ… ๊ฐœ์„ ๋ฐฉํ–ฅ: ๋” ํ•ด๋ณด๊ณ  ์‹ถ์€๊ฒƒ!

  1. ๋ชจ๋‹ˆํ„ฐ๋ง & ๋กœ๊น…
  • Airflow์˜ on_failure_callback ํ™œ์šฉํ•ด ์—๋Ÿฌ ๊ฐ์ง€ ๋ฐ Slack/Email ์•Œ๋ฆผ ๋„์ž…
  • ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜๋ฅผ S3๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ
  1. ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • Spark ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๊ฐœ์„ : ํŒŒํ‹ฐ์…”๋‹, ๋ณ‘๋ ฌ์„ฑ ์กฐ์ •
  • ํ…Œ์ด๋ธ” ํŒŒํ‹ฐ์…˜/ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ •์œผ๋กœ ์ฟผ๋ฆฌ ๋น„์šฉ ๊ฐ์†Œ
  1. ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ
  • Great Expectations ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋„๊ตฌ ๋„์ž…
  • DAG ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ์ฒดํฌ Task ์ถ”๊ฐ€
  1. ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” & ๋ถ„์„
  • BigQuery์™€ ์—ฐ๊ฒฐ๋œ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ Looker, Power BI ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ
  • ํ–ฅํ›„ ML ๋ชจ๋ธ (์˜ˆ: ์ด์ƒ ๊ฑฐ๋ž˜ ํƒ์ง€) ์—ฐ๋™ ๊ฐ€๋Šฅ์„ฑ ํƒ์ƒ‰
  1. CI/CD ์ž๋™ํ™”
  • GitHub Actions๋กœ DAG, Terraform ๋ณ€๊ฒฝ ์ž๋™ ๋ฐฐํฌ
  • ์œ ๋‹›/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•ด ์•ˆ์ •์„ฑ ํ™•๋ณด
  1. dbt ์—ฐ๋™์„ ํ†ตํ•œ SQL ๊ธฐ๋ฐ˜ ๋งˆํŠธ ๊ด€๋ฆฌ

๐Ÿ“˜ ๊ฒฐ๋ก 

๋ฐ์ดํ„ฐ ์ƒ์„ฑ๋ถ€ํ„ฐ ํด๋ผ์šฐ๋“œ ์—…๋กœ๋“œ, Spark ETL ๊นŒ์ง€ ๋ฐฐ์น˜ ํŒŒ์ดํ”„๋ผ์ธ ์ „์ฒด๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„์— ์ค‘์ ์„ ๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋„ ํฌ์ง€ ์•Š์•˜๊ณ  ๋ณ€ํ™˜ ๋กœ์ง๋„ ๋ณต์žกํ•˜๊ฒŒ ์ ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค. ์‹ค์ œ ์—…๋ฌด์—์„œ๋Š” ๋ฐ์ดํ„ฐ์–‘๊ณผ ๋กœ์ง์ด ๋ณต์žกํ•œ ๋งŒํผ ๊ฐ ๋‹จ๊ณ„์—์„œ ์ ๊ฒ€ํ•  ๋ถ€๋ถ„์ด ํ›จ์”ฌ ๋งŽ๊ณ  ์—๋Ÿฌ ํ•ด๊ฒฐ์— ์‹œ๊ฐ„๋„ ํ›จ์”ฌ ๋งŽ์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋ง, ์„ฑ๋Šฅ์ตœ์ ํ™”, ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์ฒดํฌ๊ฐ€ ํ•„์ˆ˜์ ์ธ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ƒ๊ฐ๋œ๋‹ค.

ํŒŒ์ดํ”„๋ฅผ ๊ณต์น˜๋Š” ๊ณต์ฃผ ๋ฐ์ดํ„ฐ ์ˆฒ์†์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ณ ์น˜๋Š” ๊ณต์ฃผ. ๊ณ ์ณ์•ผ ์ˆฒ์„ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.