AWS Glue(๊ธ๋ฃจ) ๋?
AWS Glue๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ, ๋ณํ, ๋ก๋(ETL)ํ๊ธฐ ์ํ ์์ ๊ด๋ฆฌํ ์๋น์ค์ ๋๋ค.
Glue๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค, ๋ฐ์ดํฐ ๋ ์ดํฌ, ๋ถ์์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ์ ์ฅ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ๊ณ ๋ณํํ ์ ์์ต๋๋ค.
PySpark ๋?
Glue์ PySpark๋ Python API์ธ PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ณํ ์์ ์ ์ํํ๋ ๊ธฐ๋ฅ์ ์๋ฏธํฉ๋๋ค.
PySpark๋ Apache Spark์ Python API๋ก, ๋ถ์ฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ถ์์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
Glue์ PySpark๋ฅผ ์ฌ์ฉํ๋ฉด Python์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
Glue์ PySpark ์ฃผ์ ๊ธฐ๋ฅ
- ๋ฐ์ดํฐ ์ถ์ถ(Extract):
- Glue์ PySpark๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, Amazon S3, RDS, Redshift, DynamoDB ๋ฑ์ AWS ์๋น์ค ๋ฐ JDBC ํธํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ณํ(Transform):
- PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ณํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. PySpark๋ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ณ ๋ณํํ๋ฉฐ, ์ง๊ณ ๋ฐ ๋ถ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ก๋(Load):
- Glue์ PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ํ ํ์์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, Amazon S3์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋, Redshift, RDS ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
- ์ค์ผ์ค๋ง ๋ฐ ์๋ํ:
- Glue์ PySpark๋ฅผ ์ฌ์ฉํ์ฌ ETL ์์ ์ ์ค์ผ์ค๋งํ๊ณ ์๋ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ, ๋ณํ, ๋ก๋ํ์ฌ ๋ฐ์ดํฐ ํ๋ฆ์ ์๋ํํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ๋ถ์ ์์ ์ข ๋ฅ
- ์ง๊ณ ๋ฐ ๊ทธ๋ฃนํ:
- ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ์ง๊ณํ์ฌ ์์ฝ ํต๊ณ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ํน์ ๊ธฐ๊ฐ ๋์์ ๋งค์ถ์ ํฉ์ฐํ๊ฑฐ๋, ์ง์ญ๋ณ ๊ณ ๊ฐ ์๋ฅผ ์ง๊ณํ ์ ์์ต๋๋ค.
- ์ ๋ ฌ ๋ฐ ํํฐ๋ง:
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํํฐ๋งํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ํน์ ๊ฐ๊ฒฉ ๋ฒ์ ๋ด์ ์ ํ์ ์ฐพ๊ฑฐ๋, ํน์ ๋ ์ง ์ดํ์ ์ฃผ๋ฌธ์ ํํฐ๋งํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ฒฐํฉ:
- ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฒฐํฉํ๊ณ ์กฐ์ธํ์ฌ ๋ ๋ณต์กํ ๋ถ์์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๊ณ ๊ฐ ์ ๋ณด์ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๊ฒฐํฉํ์ฌ ๊ณ ๊ฐ๋ณ ๋งค์ถ์ ๋ถ์ํ ์ ์์ต๋๋ค.
- ์๊ณ์ด ๋ถ์:
- ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฒฐํฉํ๊ณ ์กฐ์ธํ์ฌ ๋ ๋ณต์กํ ๋ถ์์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๊ณ ๊ฐ ์ ๋ณด์ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๊ฒฐํฉํ์ฌ ๊ณ ๊ฐ๋ณ ๋งค์ถ์ ๋ถ์ํ ์ ์์ต๋๋ค.
- ๋จธ์ ๋ฌ๋ ๋ฐ ์์ธก:
- PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๊ณ ๋ฐ์ดํฐ์ ๋ํ ์์ธก์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๊ณ ๊ฐ์ ๊ตฌ๋งค ์ด๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์์ ์ ํ์ ์์ธกํ ์ ์์ต๋๋ค.
- ํ
์คํธ ๋ถ์:
- ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ฃผ์ ๋จ์ด ๋น๋, ๊ฐ์ฑ ๋ถ์, ์ฃผ์ ๋ชจ๋ธ๋ง ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๊ณ ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ ํ์ ๋ํ ๊ธ์ ์ ๋๋ ๋ถ์ ์ ์ธ ํผ๋๋ฐฑ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ทธ๋ํ ๋ถ์:
- ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ๋คํธ์ํฌ ๊ตฌ์กฐ, ์ค์ฌ์ฑ ์งํ, ์ปค๋ฎค๋ํฐ ๊ฐ์ง ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ์์ ๋คํธ์ํฌ์์ ์ฌ์ฉ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ ์ค์ํ ์ํฅ๋ ฅ ์๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
Glue์ PySpark ์ฌ์ฉ ์์
- ๋ฐ์ดํฐ ๋ณํ:
- PySpark๋ฅผ ์ฌ์ฉํ์ฌ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ฌ์ ํ์ํ ํ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ ์ง๊ณํ์ฌ ๋ถ์์ ํ์ฉํ ์ ์์ต๋๋ค.
- ๋ค์ค ๋ฐ์ดํฐ ์์ค ๊ฐ์ ๋ฐ์ดํฐ ์ด๋:
- Glue์ PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฐ์ดํฐ ์์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, RDS์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ณํํ ํ์ Amazon S3์ ์ ์ฅํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ง๊ณ ๋ฐ ๋ถ์:
- PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ก๊ทธ ๋ฐ์ดํฐ์์ ์ฌ์ฉ์์ ํ๋ ํจํด์ ๋ถ์ํ๊ฑฐ๋, ํ๋งค ๋ฐ์ดํฐ์์ ๋งค์ถ์ ์ง๊ณํ ์ ์์ต๋๋ค.
Glue์ PySpark ์ฝ๋ ์ฌ์ฉ ์์
๊ฐ์ :
ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ถ์ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ CSV ํ์ผ ํ์์ผ๋ก Amazon S3์ ์ ์ฅ๋์ด ์์ต๋๋ค .์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์ฌ์ ๋งค์ถ์ ๊ณ์ฐํ๊ณ , ํน์ ๊ธฐ๊ฐ ๋์์ ๋งค์ถ ํต๊ณ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
1. ๋ฐ์ดํฐ ์ฝ๊ธฐ:
- ๋จผ์ , PySpark๋ฅผ ์ฌ์ฉํ์ฌ Amazon S3์ ์ ์ฅ๋ CSV ํ์ผ์ ์ฝ์ด ๋ค์ ๋๋ค.
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from pyspark.sql import SparkSession
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
# S3์ ์ ์ฅ๋ CSV ํ์ผ์ ์ฝ์ด ๋ค์
๋๋ค.
sales_data = spark.read.format("csv") \
.option("header", "true") \
.load("s3://bucket_name/path/to/sales_data.csv")
2. ๋ฐ์ดํฐ ๋ณํ:
- ๋ค์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ณ ํ์ํ ํ์์ผ๋ก ๋ณํํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ ์ง ๋ฒ์ ๋ด์ ๋ฐ์ดํฐ๋ง ์ ํํ๊ณ , ๋งค์ถ์ ๊ณ์ฐํฉ๋๋ค.
from pyspark.sql.functions import col, sum
# ๋ ์ง ๋ฒ์ ๋ด์ ๋ฐ์ดํฐ ํํฐ๋ง
filtered_data = sales_data.filter((col("date") >= "2023-01-01") & (col("date") <= "2023-12-31"))
# ๋งค์ถ ๊ณ์ฐ
total_sales = filtered_data.select(sum(col("sales_amount")).alias("total_sales"))
3. ๊ฒฐ๊ณผ ์ ์ฅ:
- ๋ง์ง๋ง์ผ๋ก, ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ํ๋ ํ์์ผ๋ก ์ ์ฅํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๋ก์ด CSV ํ์ผ์๋ก ์ ์ฅํฉ๋๋ค.
# ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ CSV ํ์ผ๋ก ์ ์ฅ
total_sales.write.format("csv").mode("overwrite").save("s3://bucket_name/path/to/total_sales_result")
์ด๋ ๊ฒ ํ๋ฉด Glue์ PySpark๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๋ณํํ๊ณ ์ ์ฅํ๋ ๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค.
์ด๋ฌํ ์์ ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ถ์์ ์๋ํํ๊ณ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
'๐ Development > AWS(Amazon Web Services)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AWS] IAM ์ด๋? (1) | 2024.02.19 |
---|---|
[AWS] Pyhton boto3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ (1) | 2024.02.16 |
[AWS] Redshift ๋? (0) | 2024.01.19 |
[AWS์์์ ์จ๋๋งจ๋ ๊ฐ๋ ] ์จ๋๋งจ๋(On-demand) ์๋น์ค ๋? (0) | 2023.11.20 |