โจ ํ๋ก์ ํธ ๊ฐ์
ํํ ํฌ ํ์ฌ๋ฅผ ๊ฐ์ ํด, ์นด๋์ฌ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ง๊ณ โ ์ ์ โ ๋ถ์ํ๋ ๋ฐฐ์น ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด๋ณด์๋ค. ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์๋ ์์๊ธฐ์ 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๋ก ์ฟผ๋ฆฌ
-
Python์ Faker ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์์ ์ ์ฉ์นด๋ ๊ฑฐ๋ ๋ฐ์ดํฐ CSV ์์ฑ
-
์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ S3 ์ ๋ก๋
-
PySpark๋ก ์ง์ญ๋ณ ์ง๊ณ, ๋ณํ
-
๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ .parquet ํฌ๋งท์ผ๋ก AWS S3์ ์ ์ฅ
-
Athena์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ๋ก ๊ตฌ์ฑํ์ฌ SQL ๋ถ์ ๊ฐ๋ฅ
-
Airflow DAG๋ก ์ ์ฒด ๊ณผ์ ์ ์๋์ผ๋ก ์ค์ผ์คํธ๋ ์ด์
๐ข ํธ๋ฌ๋ธ์ํ ๊ณผ ์ฝ์ง์ ๊ธฐ์ต
- ์์ดํ๋ก์ฐ DAG๊ฐ ์๋์ด, ํ์์ ๋ฉ์ถค
- ์์ธ: ์์ดํ๋ก์ฐ scheduler ์ปจํ ์ด๋๊ฐ ์์
- ํด๊ฒฐ: ๋ณ๋์ scheduler service ๋ฅผ docker-compose.yml ์ ์ถ๊ฐ
- ์์ดํ๋ก์ฐ์์ ํ์ด์ฌ ํจํค์ง๊ฐ ์๋์ด
- ์์ธ: ์ปจ๋ฐ์ด๋์ faker, boto3, pyspark ์ค์น๋์ง ์์
- ํด๊ฒฐ: ์ปค์คํ Dockerfile.airflow ๋ง๋ค๊ณ ์์ pip install -r requirements.txt ์ถ๊ฐ. docker-compose.yml ์์ image: ๋ง๊ณ build:๋ก ์ด ์ปค์คํ ๋น๋ ์ฌ์ฉ.
- ์์ดํ๋ก์ฐ ์คํจ Variable AWS_ACCESS_KEY_ID Does Not Exist
- ์์ธ: {{ var.value.AWS_ACCESS_KEY_ID }} ์ธํ ์ด ์๋์์
- ํด๊ฒฐ: ์์ดํ๋ก์ฐUI์์ Admin -> Variables ์ถ๊ฐ
- S3 โFile Not Foundโ
- ์์ธ: ์กด์ฌํ์ง ์๋ ํด๋์ ์ ์ฅ ์๋, ํ์ผ ๊ฒฝ๋ก ๋ถ์ผ์น
- ํด๊ฒฐ: ์ปจํ ์ด๋๋ค ์ฌ์ด์ ํ์ผ ๊ฒฝ๋ก ํต์ผ, ํด๋ ์์ฑ ํ ์ ์ฅ
- DockerOperator โCannot Connect to Docker Daemonโ
- ์์ธ: ๋์ปค ์์ผ์ด ์์ดํ๋ก์ฐ ์ปจํ ์ด๋์ ๋ง์ดํธ ์๋จ
- ํด๊ฒฐ: airflow-webserver service volumns ์ ์๋ ์ถ๊ฐ
- /var/run/docker.sock:/var/run/docker.sock
- 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")]
โ ๊ฐ์ ๋ฐฉํฅ: ๋ ํด๋ณด๊ณ ์ถ์๊ฒ!
- ๋ชจ๋ํฐ๋ง & ๋ก๊น
- Airflow์ on_failure_callback ํ์ฉํด ์๋ฌ ๊ฐ์ง ๋ฐ Slack/Email ์๋ฆผ ๋์
- ๋ก๊ทธ ์ ์ฅ ์์น๋ฅผ S3๋ก ํ์ฅ ๊ฐ๋ฅ
- ์ฑ๋ฅ ์ต์ ํ
- Spark ์ฒ๋ฆฌ ์ฑ๋ฅ ๊ฐ์ : ํํฐ์ ๋, ๋ณ๋ ฌ์ฑ ์กฐ์
- ํ ์ด๋ธ ํํฐ์ /ํด๋ฌ์คํฐ ์ค์ ์ผ๋ก ์ฟผ๋ฆฌ ๋น์ฉ ๊ฐ์
- ๋ฐ์ดํฐ ํ์ง ๊ฒ์ฆ
- Great Expectations ๊ฐ์ ๋ฐ์ดํฐ ๊ฒ์ฆ ๋๊ตฌ ๋์
- DAG ์์์ ๋ฐ์ดํฐ ์ ํจ์ฑ ์ฒดํฌ Task ์ถ๊ฐ
- ๋ฐ์ดํฐ ์๊ฐํ & ๋ถ์
- BigQuery์ ์ฐ๊ฒฐ๋ ๋์๋ณด๋๋ฅผ Looker, Power BI ๋ฑ์ผ๋ก ๊ตฌ์ฑ
- ํฅํ ML ๋ชจ๋ธ (์: ์ด์ ๊ฑฐ๋ ํ์ง) ์ฐ๋ ๊ฐ๋ฅ์ฑ ํ์
- CI/CD ์๋ํ
- GitHub Actions๋ก DAG, Terraform ๋ณ๊ฒฝ ์๋ ๋ฐฐํฌ
- ์ ๋/ํตํฉ ํ ์คํธ ์ถ๊ฐํด ์์ ์ฑ ํ๋ณด
- dbt ์ฐ๋์ ํตํ SQL ๊ธฐ๋ฐ ๋งํธ ๊ด๋ฆฌ
๐ ๊ฒฐ๋ก
๋ฐ์ดํฐ ์์ฑ๋ถํฐ ํด๋ผ์ฐ๋ ์ ๋ก๋, Spark ETL ๊น์ง ๋ฐฐ์น ํ์ดํ๋ผ์ธ ์ ์ฒด๋ฅผ ๊ตฌํํด๋ณผ ์ ์์๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ ํ์ดํ๋ผ์ธ ๊ตฌํ์ ์ค์ ์ ๋์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ ํฌ์ง ์์๊ณ ๋ณํ ๋ก์ง๋ ๋ณต์กํ๊ฒ ์ ์ฉํ์ง ์์๋ค. ์ค์ ์ ๋ฌด์์๋ ๋ฐ์ดํฐ์๊ณผ ๋ก์ง์ด ๋ณต์กํ ๋งํผ ๊ฐ ๋จ๊ณ์์ ์ ๊ฒํ ๋ถ๋ถ์ด ํจ์ฌ ๋ง๊ณ ์๋ฌ ํด๊ฒฐ์ ์๊ฐ๋ ํจ์ฌ ๋ง์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ํฐ๋ง, ์ฑ๋ฅ์ต์ ํ, ๋ฐ์ดํฐ ํ์ง์ฒดํฌ๊ฐ ํ์์ ์ธ ๋ค์ ๋จ๊ณ๋ก ์๊ฐ๋๋ค.
๋ฐ์ดํฐ ์ฒ์์์ ํ์ดํ๋ผ์ธ์ ๊ณ ์น๋ ๊ณต์ฃผ. ๊ณ ์ณ์ผ ์ฒ์ ๋๊ฐ ์ ์๋ค.