[AWS] Glue
Glue๋ AWS์์ ์ ๊ณตํ๋ ๊ด๋ฆฌํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ ์์คํ
์ด๋ค.
Airflow์ ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ Spark์ ํตํฉ๋ ํํ๋ก ์ ๊ณต๋๋ค.
๋น์ฉ
Glue ํ๋ซํผ์๋ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ ์์๊ฐ ์ ๊ณต๋์ง๋ง, ๊ฐ์ฅ ์ฃผ๋ ์์๋ ๋ฐ์ดํฐ ์ค๊ฐ ์ฒ๋ฆฌ ๋ชฉ์ ์ ETL ๊ธฐ๋ฅ์ด๋ค.
https://aws.amazon.com/glue/pricing/
ETL์ ๊ฒฝ์ฐ๋ฅผ ๋ค์๋ฉด, ํ๋ก๋น์ ๋ ๋น์ฉ์ด ๋ฐ๋ก ์๊ณ ์์ ์ ์๋ชจ๋ ์๊ฐ๋น*๋ ธ๋๋น ๋น์ฉ์ ์ฒญ๊ตฌํ๋ค.
์ฌ๊ธฐ์ ์ปดํจํ ๋น์ฉ์ DPU๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธก์ ๋๋๋ฐ, ํ๋์ DPU๋ 4 vcpu + 16 gb์ง๋ฆฌ์ ๊ณ ์ฑ๋ฅ ๋จธ์ ์ด๋ค. DPU ๊ฐฏ์๋ ์์ ํฌ๊ธฐ์ ๋ฐ๋ผ์ ์๋์ผ๋ก ์ ํ๋๋ค.
์คํ ๋จ์๊ฐ ๋ง๊ณ ๋น์ฉ๋ ๋ค ๋ฐ๋ก๋ผ ๋ญ๋ผ๊ณ ์ถ์ฝํ๊ธฐ ์ด๋ ค์ด๋ฐ, ์คํ์๊ฐ ๊ธฐ์ค์ผ๋ก DPU 1๊ฐ-1์๊ฐ๋น 0.44๋ฌ๋ฌ ์ ๋๋ฅผ ๋ถ๊ณผํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
ETL ์์ํด๋ณด๊ธฐ
๊ฐ๋จํ ETL ์์ ๋ฅผ ๋๋ ค๋ณด๋ ๊ฒ์ผ๋ก ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๋ต ํ์ด๋ณด๊ฒ ๋ค.
์ ์ฉ ํญ์ผ๋ก ์ด๋ํ ๋ค์
์์ฑ ์ฐฝ์ผ๋ก ์ง์ ํ๋ค.
Visual - UI ๊ธฐ๋ฐ์ผ๋ก ์ํฌํ๋ก๋ฅผ ์ ์ํ ์๋ ์๊ณ , ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ์ ์ํ ์๋ ์๋ค.
UI ์์ฑ ๊ธฐ๋ฅ์ ํ๊ณ๊ฐ ๋ง์์ ์ด๊ฑธ๋ก ๋ค ํด๋จน๊ฒ ๋ค๋ ์๊ฐ์ ํฌ๊ธฐํ๋๊ฒ ์ข๊ณ , ๊ธฐ๋ณธ์ ์ธ ํ๋ง ์ก๊ณ ์์ํ๋ค๋ ๋๋์ผ๋ก ์ฐ๋๊ฒ ๋ฐ๋์งํ๋ค. ๊ฒฐ๊ตญ์๋ ์ฝ๋๋ก ์์ ํด์ผ ํ ๊ฒ์ด๋ค.
์ด๋ฒ ์์ ์์๋ DynamoDB์ ๋ฐ์ดํฐ๋ฅผ S3์ parquet ํํ๋ก ์ ์ฅํ๋ ๊ฒ์ ์๋ํด๋ณด๊ฒ ๋ค.
S3 parquet์ผ๋ก ์ ๋นํ ๋ง์์ ์ ์ฅํด๋๊ธฐ๋ง ํด๋ ์ ์ฅ ๋น์ฉ์ด ๊ด์ฐฎ์ ํธ์ด๊ณ , Athena๋ฅผ ํตํด์ ๋น ๋ฅธ ๋ถ์์ ์ฒ๋ฆฌํ๊ธฐ๋ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ฌ๋ก์ ๊ฐ๊น๋ค.
Source - DynamoDB
๋จผ์ ํ ์ด๋ธ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ๋นํ ์ค๋นํด๋จ๋ค.
8๊ฐ๋ค.
ํ
์ด๋ธ์๋ PITR์ด ์ผ์ ธ์์ด์ผ ํ๋ค.
AWS Glue์์ DynamoDB Source๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์, ๊ทธ๋ฆฌ ๋จ์ํ์ง๋ง์ ์๋ค.
-
๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ DynamoDB ์์ฒด์ S3 export ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด DynamoDB์ ๋ฐ์ดํฐ๋ฅผ S3๋ก ์ฎ๊ธด ๋ค์์ ๊ทธ๊ฑธ ๋ค์ ์ฝ์ด์ Source๋ก ์ฌ์ฉํ๋ ํํ๊ฐ ๋๋ค.
์ด๋ฌ๋ฉด ๋น์ฐํ ์ถ๊ฐ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ์์ธํ ๊ฒ์ ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/223715737789 -
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ DynamoDB์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํฌ๋กค๋งํด์ Source๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๋ ํฌ๋กค๋ง ๋งค์ปค๋์ฆ์ด ์๋๋ฐ, ๋น์ฐํ DynamDB ์ฝ๊ธฐ ์๊ธ ๋จ์๊ฐ ๋ถ๊ณผ๋๋ค.
๋๋ ์ง๊ธ 1๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ค ํ๋ค.
DynamoDB๋ฅผ ๋๋๊ทธํด์ ๋ง๋ค๊ณ
ํ
์ด๋ธ์ ์ง์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ S3์ ์ค๊ฐ ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ค.
๊ทธ๋ฌ๋ฉด ์ ๊ธฐ๋ค๊ฐ DynamoDB ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธด ๋ค์์, ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๋ฒํท์ ๊ฒฐ๊ณผ๋ฌผ์ฉ์ผ๋ก ๋ฐ๋ก ๋ง๋ค์ด๋จ๋ค.

Target - S3 ์ค์
์, ์ด๋ฒ์๋ ์ ์ฅ๋๋ ๋์ ํญ๋ชฉ์ด๋ค.

๋์ด๋ค๊ฐ ๋ง๋ค๊ณ , ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ฐฉ๊ธ ๋ง๋ DynamoDB๋ก ์ง์ ํ๋ค.
์ ์ฅ ๋ฐฉ์์ ์์ถ ํ์์ธ parquet, ์์ถ ๋ฐฉ์์ snappy๋ฅผ ์ ํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค. ๋๋ ๋์ถฉ ๋ฃจํธ๊ฒฝ๋ก๋ก ํ๋๋ฐ, ๋ณดํต์ ์ข ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ๋๋ก ํ์ ๋๋๋๊ฒ ์ข์ ๊ฒ์ด๋ค. athena ์ฉ์ผ๋ก ์ฌ์ฉํ ๊ฑฐ๋ผ๋ฉด ๋๋์ฑ.
Spark ์ค์
Job details์์๋ spark ์์ค์ ์ค์ ์ ํ ์ ์๋ค.
role์ด ํ์ํ๋ค๊ณ ํ๋ค. ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์๋๊ฑฐ๊ฐ๋ค.
์ผ๋จ role๋ถํฐ ํ๋ ๋ง๋ค์ด์ค๋ค.
๊ท์ฐฎ์์ DynamoDB์ S3์ ๋ํ FullAccess๋ฅผ ๋ง๋ค์ด์ ๋ฃ์๋๋ฐ, ์ ๋๋ก ๊ด๋ฆฌํ ๊ฑฐ๋ผ๋ฉด ๊ถํ ๋์ ๋ฆฌ์์ค๋ฅผ ์ง์ ํ๋๊ฒ ์ข๋ค.

๊ทธ๋ฆฌ๊ณ , ์์ฑ๋ ์ํฌํ๋ก๋ ์ฝ๋๋ก๋ ์ ์ดํ ์ ์๋ค.
์ข๋ง ์ปค์คํ
ํ๋ ค๊ณ ํด๋ ๊ฑด๋ค๊ฒ ๋๋ ์์ ์ด ์ฌ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํธ๋ฆฌ๊ฑฐํ๋ฉด, ์์ ์ด ์์๋๋ค.

Glue ETL ์์ฒด๊ฐ ๊ทธ๋ฆฌ ๋๋ฆฐ๊ฑด ์๋๋ฐ, Dynamo export ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ค์ ์ ๋ฐ์ ์ธ ์คํ์๊ฐ ๋ํ ๋์ด์ก๋ค.
7๋ถ ์ ๋๊ฐ ๊ฑธ๋ ธ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฌผ ๋ฒํท ๊ฒฝ๋ก์ ๋ค์ด๊ฐ๋ณด๋ฉด, parquet ํ์ผ๋ค์ด ๋ค์ด๊ฐ์์ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์ด๋ ๊ฒ ๊ธฐ๋ณธ์ต์
๋ง์ผ๋ก ๋ด๋ณด๋ด๋ฉด ๋ฌธ์ ๊ฐ ์ข ์๋ค. dynamoDB ๊ธฐ๋ณธ ๋์์ ๋ฐ๋ผ ํ 2๊ฐ์ฉ ๋ฌถ์ด์ ํ๋์ ํ์ผ๋ก ๋ง๋ค์๋ค๋ณด๋ ํ์ผ์ด ๋๋ฌด ์๊ฒ ๋ง๊ณ , ์์ถ๋ฅ ๋ ๋จ์ด์ง๋ค.
๊ฒ๋ค๊ฐ athena์ ํ๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ณ ๋ คํ๋ค๋ฉด ํด๋ ๋จ์๋ก ํํฐ์
์ ๋๋ ํ์๋ ์๋ค.
๋ฐ์ดํฐ ํํฐ์ - ๊ฐ์ ํํฐ์
ํ์ผ ํ๋์ ๋ค์ด๊ฐ๋ ํ ๊ฐ์๋ฅผ ์กฐ์ ํด๋ณด์.
๋จผ์ 2๊ฐ์ฉ ๋ฌถ๋๊ฒ ์๋๋ผ 5๊ฐ์ฉ ๋ฌถ๋๋ก ํํฐ์
๋จ์ ์์ ์ ํด๋ณด๊ฒ ๋ค.
๊ธฐ์กด์ ์ด๋ฐ ์ฝ๋์๋ค๊ฐ, ์ค๊ฐ์ transform ๋์์ ์ค์
๋ฃ์ผ๋ฉด ๋๋ค.
from awsglue.dynamicframe import DynamicFrame
importํ๋ ์ถ๊ฐํด์ฃผ๊ณ
# DynamicFrame์ DataFrame์ผ๋ก ๋ณํ
df = AmazonDynamoDB_node1736078338707.toDF()
# ํํฐ์
์ ์กฐ์ (4๊ฐ ๋ ์ฝ๋๋น ํ๋์ ํ์ผ๋ก ๋ฌถ๊ธฐ)
num_partitions = df.count() // 4
df_repartitioned = df.repartition(num_partitions)
# DataFrame์ ๋ค์ DynamicFrame์ผ๋ก ๋ณํ
dyf_repartitioned = DynamicFrame.fromDF(df_repartitioned, glueContext, "dyf_repartitioned")
์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐํ๋ ์ ์ฐ์ฐ ์ ๋นํ ๊ฑฐ์น๊ณ , ๋ค์ ๊ธฐ์กด dynamic frame์ผ๋ก ๋ณํํด์ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ ค๋ณด๋ฉด ์ด๋ฒ์๋
4๊ฐ์ฉ 2๊ฐ์ ํ์ผ๋ก ์์ฑ์ด ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ํํฐ์ - ํด๋ ๋ฌถ๊ธฐ
ํน์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ ๋จ์ ํํฐ์ ๋์ ํด๋ณด๊ฒ ๋ค. ์ด๊ฑด ํ์ผ์ ํ ์ง์ด๋ฃ๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ๋ค.
์ด๊ฑด ์ฌ๋งํ๋ฉด ๋ฐ์ดํฐ ์์ค์ ๋ช
ํํ ๊ตฌ๋ถ ๊ธฐ์ค์ด ์๋ ๊ฒ ์ข๋ค.
์ค๊ฐ์ ๊ฐ๊ณตํด์ ์ง์ด๋ฃ์ด๋ ๋๋๋ฐ, ๋๋ ์ผ๋จ ์๊ฐ ๊ธฐ์ค month๋ฅผ ์ถ๊ฐํ๋ค.

๊ทธ๋ฆฌ๊ณ partitionKeys ํ๋์ ํํฐ์
๊ธฐ์ค์ผ๋ก ์ผ์ ํ๋ "month"๋ฅผ ์ง์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฆฌ๋ฉด


์ด๋ ๊ฒ ํด๋ ๋จ์๋ก ๊ฐ์ง๋ฐํ๊ฒ ์ ์ฅ์ด ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋์ถฉ ์ด๋ฐ ๋๋์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://aws.amazon.com/ko/glue/
https://aws.amazon.com/blogs/database/export-and-analyze-amazon-dynamodb-data-in-an-amazon-s3-data-lake-in-apache-parquet-format/