[AWS] Athena: S3

Athena๋Š” S3์— ๋Œ€ํ•œ SQL ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋‹ค.

๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๊ฐ™์€๊ฑธ ๋‹ค๋ฃจ๋‹ค๋ณด๋ฉด S3 ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€์— ํŒŒ์ผ์„ ๊ธฐ๋กํ•˜๊ฒŒ ๋  ์ผ์ด ๊ฝค ๋งŽ๋‹ค.

๊ทผ๋ฐ S3์— ์ €์žฅํ•˜๋Š”๊ฑด ๊ทธ๋ ‡๋‹ค ์ณ๋„, ๊บผ๋‚ด์“ฐ๋Š” ๊ฒƒ์€ ์ƒํ™ฉ์ด๋‚˜ ์ทจํ–ฅ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ AWS์˜ redshift๋‚˜ GCP์˜ bigquery ๋“ฑ์ด ์ด๋Ÿฐ ๋น…๋ฐ์ดํ„ฐ ๋ถ„์„์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์˜ ๋‹จ์ ์€, ์•„๋ฌด๋ž˜๋„ ๋™๊ธฐํ™”๋ฅผ ์ถ”๊ฐ€๋กœ ์‹œ์ผœ์ค˜์•ผ ํ•˜๊ณ , ๊ทธ๋Ÿฐ๋ฐ์„œ ๋ฐœ์ƒํ•˜๋Š” ์ „์†ก ๋น„์šฉ์ด๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋ฉด Athena๋Š” ๋ณ„๋‹ค๋ฅธ ์ฒ˜๋ฆฌ ์—†์ด S3์— ๋ฐ”๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
Presto, Apache Spark, Aparch Hive ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ํŽ˜ํƒ€๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.




๋น„์šฉ

https://aws.amazon.com/ko/athena/pricing/?nc=sn&loc=3

์ˆœ์ˆ˜ํ•˜๊ฒŒ Athena์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์š”๊ธˆ์€, ์Šค์บ”ํ•œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋‹น์œผ๋กœ ๋ถ€๊ณผ๋œ๋‹ค.
ํ…Œ๋ผ๋ฐ”์ดํŠธ๋‹น 5๋‹ฌ๋Ÿฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  S3์—์„œ ๋ฐœ์ƒํ•œ ์š”๊ธˆ์€ ๋˜ ๊ทธ๊ฒƒ๋Œ€๋กœ ๋‚˜๊ฐ„๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š”๋ฐ์„œ ๋‹ค ๋น„์šฉ์ด ๋ถ€๊ณผ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” Lambda ์š”๊ธˆ๋„ ๋œฏ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ž˜์ €๋ž˜ ์“ฐ๋‚˜๋ณด๋‹ค.




vs Redshift

๋น…๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ์ ์—์„œ๋Š” Redshift์™€ ์žฅ๋ฅด๊ฐ€ ๋น„์Šทํ•˜์ง€๋งŒ, ์˜์—ญ์ด ์™„์ „ํžˆ ๊ฒน์น˜์ง€๋Š” ์•Š๋Š”๋‹ค.

Redshift๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์…‹ ์ฒ˜๋ฆฌ์— ๋Šฅํ•˜๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๊ฒจ๋„ฃ๊ณ  ๋น ๋ฅธ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ€๊ทœ๋ชจ JOIN ์ž‘์—…๋„ ๋ฌด๋ฆฌ์—†์ด ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋ฉด Athena๋Š” ๋‹จ์ผ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”๋˜์–ด์žˆ์œผ๋ฉฐ, JOIN ๊ฐ™์€ ์ž‘์—…์—๋Š” ์„ฑ๋Šฅํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์‚ฌ์šฉ์„ฑ์—์„œ๋Š” Athena๊ฐ€ ํฐ ๊ฐ•์ ์„ ๊ฐ€์ง„๋‹ค. Redshift์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•ด์„œ ๋™๊ธฐํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ, Athena๋Š” ๋ช‡๋ฒˆ์˜ ํด๋ฆญ๋งŒ์œผ๋กœ S3๋ฅผ ํ†ต์งธ๋กœ ๋ฐ”๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„์šฉ ๋ฉด์—์„œ๋Š” ๋…ผ๋ž€์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Redshift๋Š” ๋น„์šฉ ๊ณ„์‚ฐ์ด ๋งค์šฐ ๋ณต์žกํ•œ ๋ฐ˜๋ฉด์— Athena๋Š” ๊ฝค๋‚˜ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…๋ฃŒํ•œ ๊ณผ๊ธˆ ์ฒด๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์„ฑ๋Šฅ์€ ๋งˆ์น˜ RDB vs NoSQL์˜ ๋Œ€๊ฒฐ๊ณผ ๋น„์Šทํ•˜๋‹ค.
๋‹จ์ˆœ Read๋‚˜ Aggregate๋Š” ๋Œ€์ฒด๋กœ Athena๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด๋‹ค.
ํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”๊ฐ„ Join์— ๋Œ€ํ•ด์„œ๋Š” Redshift๊ฐ€ ํ™•์‹คํ•˜๊ฒŒ ๋” ๋น ๋ฅด๋‹ค.




Data Source

๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์„œ ๊ฐ€์ ธ์˜ฌ์ง€์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์ด๋‹ค.

S3๋งŒ์„ ์‚ฌ์šฉํ• ๊ฑฐ๋ผ๋ฉด ์ถ”๊ฐ€๋กœ ๊ตฌ์„ฑ์„ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.
์ด๋ฏธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ

๋จผ์ € ์›๋ณธ ์†Œ์Šค๋ฅผ ์ €์žฅํ•ด๋‘˜ ๋ฒ„ํ‚ท์„ ๋งŒ๋“ ๋‹ค. ๊ผญ ์ „์šฉ ๋ฒ„ํ‚ท์„ ๋งŒ๋“ค์–ด์•ผ๋งŒ ํ•˜๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ๊ธฐ์กด ๋ฒ„ํ‚ท์— ํด๋” ์ถ”๊ฐ€ํ•ด์„œ ๊ฑฐ๊ธฐ๋‹ค ์จ๋„ ๋˜๊ธด ํ•œ๋‹ค.

์—ฌ๊ธฐ๋‹ค๊ฐ€ csv๋กœ ํ…Œ์ŠคํŠธ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ ค๋ณด๊ฒ ๋‹ค.
csv ๋ง๊ณ ๋„ tcv, json ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํฌ๋งท์„ ์ง€์›ํ•œ๋‹ค.

time,user_id,board_name,action
2022-03-06 22:06,bob,game,insert
2022-03-05 22:06,jake,free,delete
2022-03-05 22:06,jake,stock,delete
2022-03-05 22:06,jake,free,insert
2022-03-05 22:06,bob,game,insert
2022-03-05 22:06,mike,qna,delete
2022-03-05 22:06,alica,qna,insert
2022-03-05 22:06,mike,game,delete
2022-03-05 22:06,mike,stock,view
2022-03-05 22:06,jake,qna,insert

์ด๋ ‡๊ฒŒ ์ž˜ ์˜ฌ๋ผ๊ฐ€๋ฉด ๋๋‹ค.




์ถœ๋ ฅ ๊ฒฝ๋กœ ์ง€์ •

Athena๋Š” ์ „๋ถ€ S3๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋„ S3์— ๋ฐฑ์—…์„ ํ•ด๋‘๋Š”๋ฐ, ๊ทธ๊ฑธ ์ €๊ฑธ ๋ˆŒ๋Ÿฌ์„œ ํ•˜๋ฉด ๋œ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ๊น”์•„์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์ € ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๊ฐ€๊ธ‰์  ๋น„์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.




๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ

์•„ํ…Œ๋‚˜๋„ RDB๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค->ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ง„๋‹ค.
๋จผ์ € ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค€๋‹ค.

CREATE DATABASE test;




ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ฟผ๋ฆฌ๋Š” ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์จ์„œ ์งœ๋Š”๊ฒŒ ํŽธํ•˜๋‹ค.

์ด๋ฆ„ ์ง“๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ ๋ฅด๊ณ 

ํ…Œ์ŠคํŠธ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๊ฒฝ๋กœ๋Š” /๋กœ ๋๋‚˜์•ผํ•˜๊ณ , ์•„ํ…Œ๋‚˜๋Š” ์ €๊ธฐ ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ์„ ์ „๋ถ€ ํ’€์Šค์บ”๋•Œ๋ฆฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ ํŒŒ์ผ ํ˜•ํƒœ๋„ ์ •ํ•ด์ค€๋‹ค.

๋‚ด๊ฐ€ csv๋กœ ์˜ฌ๋ ธ์œผ๋‹ˆ๊นŒ, csv๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ปฌ๋Ÿผ์„ ์ˆœ์„œ๋Œ€๋กœ ์ •์˜ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

์ƒ์„ฑํ•ด์ค€๋‹ค.


๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ์™ผ์ชฝ์— ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๋ฉด ์ž˜ ๋œ ๊ฒƒ์ด๋‹ค.

csv๋งŒ ์ฒ˜๋ฆฌํ• ๊ฑฐ๋ผ๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

CREATE EXTERNAL TABLE IF NOT EXISTS `DB๋ช…`.`ํ…Œ์ด๋ธ”๋ช…` (
  ...
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") 
LOCATION 's3://...-cost/aws/๋””๋ ‰ํ„ฐ๋ฆฌ/' -- ์ฝ์–ด์˜ฌ csv ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ
TBLPROPERTIES ("skip.header.line.count"="1") -- ์ฒซ๋ฒˆ์งธ row๋Š” ์ƒ๋žต



๋ถ„์„ํ•˜๊ธฐ

ํ…Œ์ด๋ธ”์ด ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋ฉด, ๊ทธ๋ƒฅ RDB์“ฐ๋“ฏ์ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋œ๋‹ค.

๋ถ„์„ ๊ฒฐ๊ณผ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ S3 ๋ฒ„ํ‚ท์— ๋ฐฑ์—…๋œ๋‹ค.



์ฐธ์กฐ
https://aws.amazon.com/ko/athena/
https://aws.amazon.com/ko/blogs/big-data/analyzing-data-in-s3-using-amazon-athena/