[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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€, ๊ทธ๋ฆฌ ๋‹จ์ˆœํ•˜์ง€๋งŒ์€ ์•Š๋‹ค.

  1. ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ DynamoDB ์ž์ฒด์˜ S3 export ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด DynamoDB์˜ ๋ฐ์ดํ„ฐ๋ฅผ S3๋กœ ์˜ฎ๊ธด ๋‹ค์Œ์— ๊ทธ๊ฑธ ๋‹ค์‹œ ์ฝ์–ด์„œ Source๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.
    ์ด๋Ÿฌ๋ฉด ๋‹น์—ฐํžˆ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    https://blog.naver.com/sssang97/223715737789

  2. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ 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/