[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/