[AWS] ๐ Glue Crawler๋ก ํ ์ด๋ธ ๋ง๋ค๊ณ Athena๋ก ์กฐํํ๊ธฐ
Glue Crawler๋ก S3 ์คํค๋ง ์์ฑ
์ง๋ ํฌ์คํ ์์๋ csvํ์ผ์ S3์ ์ ๋ก๋ํ๊ณ Athena์์ ์ง์ ํ ์ด๋ธ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ์ฌ ์๋์ผ๋ก ๋ง๋ค์ด ์กฐํํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์๋ค.
์ด๋ฒ์๋ AWS Glue ์๋น์ค๊ฐ ์ ๊ณตํ๋ Glue Crawler๋ฅผ ์ฌ์ฉํด S3์ ๋ฐ์ดํฐ๋ฅผ ์ค์บํ๊ณ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ๋ง๋ค์ด์ฃผ๋ ์๋น์ค๋ฅผ ์ด์ฉํด Athena๋ก ์กฐํํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ ๊ฒ์ด๋ค.
Glue ํฌ๋กค๋ฌ๋ก ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ณํํ๊ธฐ ์ํด์ ๋น์ฐํ ๋์์ผ๋ก ํ๊ณ ๋ฉํ ํ ์ด๋ธ์ ์์ฑํ ๋ฐ์ดํฐ ์์ค๊ฐ ํ์ํ๋ค.
RDS, S3, DynamoDB ๋ฑ AWS์ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฟ๋ง ์๋๋ผ JDBC๋ฅผ ์ง์ํ๋ DB, file ๋ฑ๋ฑ ๊ฑฐ์ ๋ชจ๋ ํํ์ ๋ฐ์ดํฐ ์ ์ฅ์์ ์๋ ํ์ผ์ ์ด์ฉํด ํฌ๋กค๋ฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์ด๋ฒ ๊ฐ์์์๋ json ํ์ผ์ S3์ ์ ๋ก๋ํ๊ณ ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์คํ ํด๋ณด์.
S3 ๋ฒํท ์์ฑ ๋ฐ json ๋ก๊ทธ ์ฌ๋ฆฌ๊ธฐ
{"time":"2022-03-05 22:06:13","user_id":"bob","board_name":"game","action":"insert"}
{"time":"2022-03-05 22:06:14","user_id":"jake","board_name":"free","action":"delete"}
{"time":"2022-03-05 22:06:15","user_id":"jake","board_name":"stock","action":"delete"}
{"time":"2022-03-05 22:06:16","user_id":"jake","board_name":"free","action":"insert"}
{"time":"2022-03-05 22:06:17","user_id":"bob","board_name":"game","action":"insert"}
Glue ํฌ๋กค๋ฌ ์์ฑํ๊ธฐ
AWS Glue Crawler๋ฅผ ์ฌ์ฉํด S3 ๋ฒํท์ ์ ์ฅ๋ ๋ด์ฉ๋ค์ ์ญ ์ดํด๋ณด๊ณ ์คํค๋ง์ ํจ๊ป ํ ์ด๋ธ์ ์์ฑํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฐธ๊ณ ํด์ Athena๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด์ ์๋ ๊ฒ์ด๋ค.
1. ํฌ๋กค๋ฌ ์ ๋ณด ์ค์
๊ฐ๋จํ๊ฒ๋ ์ด๋ฆ๋ง ์ค์ ํ๊ณ ๋์ด๊ฐ๋ ๋๋ค.
๋ฐ์ ํ๊ทธ, ์ค๋ช , ๋ณด์๊ตฌ์ฑ, ๋ถ๋ฅ์ ์ต์ ์ค์ ์์ ํน๋ณํ๊ฑด ์์ง๋ง, ๋ถ๋ฅ์๋ ๋์ ๋ฐ๋ผ์ ํ์ํ ์ ์๋ค.
csv ํ์ผ์ผ ๋ ํนํ ๊ทธ๋ฐ๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ผํ๋ฅผ ๊ตฌ๋ถ์๋ก ์ฌ์ฉํ๊ธด ํ์ง๋ง ๊ตฌ๋ถ์๊ฐ ํต์ผ๋์ง ์์ ๊ฒฝ์ฐ ๋ถ๋ฅ์๋ฅผ ์ด์ฉํด ๊ตฌ๋ถ์๋ฅผ ํต์ผํ ์ ์๋ค.
2. ํฌ๋กค๋ฌ ์์ค ํ์
Data store(๋ฐ์ดํฐ ์ ์ฅ์)๋ฅผ ๋ฐ๋ผ๋ณผ์ง, ๊ธฐ์กด์ ์์ฑํ Data Catalog์ ๋ฉํ ๋ฐ์ดํฐ ํ ์ด๋ธ์ ๋ฐ๋ผ๋ณผ ์ง ์ ํํ๋ค.
3. ๋ฐ์ดํฐ ์คํ ์ด ์ถ๊ฐ
๋ฉํ ํ ์ด๋ธ์ ์์ฑํ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ 1๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐํ ์ ์๋ค.
์์์ ๋ง๋ ๋ฒํท๊ฒฝ๋ก๋ฅผ ํฌํจ ๊ฒฝ๋ก ๋์ ์ถ๊ฐํด์ค๋ค.
๋ ์ถ๊ฐํ ์ง ๋ฌผ์ด๋ณด๋ ์ต์ ์ด ๋์ค๋ฉด ์๋์ค๋ฅผ ์ ํํ๊ณ ๋ค์์ ๋๋ฌ์ค๋ค.
4. IAM ๊ท์น ์ค์
๋ณธ๋ AWS์์๋ S3์ ์ก์ธ์ค ํ๊ธฐ ์ํด์๋ IAM ๊ถํ์ด ํ์ํ๋ค.
Glue Crawler๋ ์์ธ๊ฐ ์๋๋ฉฐ, ์ด ๋จ๊ณ์์ IAM ์ญํ ์ ์์ฑํด์ ๋ฑ๋กํด์ค ์ ์๋ค.
5. ์ค์ผ์ฅด ์ค์
ํฌ๋กค๋ฌ์ ์๋ ์ค์ผ์ค์ ์ค์ ํ ์ ์๋ค.
์๊ฐ๋ง๋ค, ์ผ๋ง๋ค, ์ฃผ๋ง๋ค ๋ฑ ๊ธฐ๋ณธ ์ต์ ์ด ์๊ณ ์ง์ ์ปค์คํ ํ๊ฑฐ๋ ์ํ ๋๋ง ์๋ํ๋๋ก ๊ณ ๋ฅผ ์๋ ์๋ค.
๋ณดํต ์จ๋๋ฉ๋(Run on demand)๋ฅผ ์ค์ ํ ๋ค ํ์ํ ๊ฒฝ์ฐ์๋ง ๋๋ค(์๋ฒ๋ฆฌ์ค) ๋ฑ์ผ๋ก ์คํ ์ํค๋ ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
6. ํฌ๋กค๋ฌ ์ถ๋ ฅ ๊ฒฐ๊ณผ ์ ์ฅ์ ์ค์
๋ฉํ ํ ์ด๋ธ(Cralwer ๊ฒฐ๊ณผ)์ ์ ์ฅํ ๊ณณ์ ์ง์ ํ๋ค.
Add database๋ก ๋ฐ๋ก ๋ง๋ค์ด ๋ณด์.
8. ์ต์ข ํ์ธ
10. ํฌ๋กค๋ฌ ์คํ
์ด์ ๋ฑ๋กํ ํฌ๋กค๋ฌ๋ฅผ ์คํํด์ S3์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธํ ํ๋ค.
ํ์ผ์ ๋ฐ์ดํฐ๊ฐ ํด์๋ก 1๋ถ ์ด์ ๊ฑธ๋ฆด์ ์์ผ๋ ์ฒ์ฒํ ๊ธฐ๋ค๋ฆฌ์.
kb ๋จ์์ ์์ ํ์ผ๋ก ์ค์ต์ ํ๊ณ ์์ด ํฌ๊ฒ ์๊ด์์ง๋ง, glue๋ ์๋น์ค ์๊ธ์ด ๊ฝค ๋น์ผ ํธ์ ์ํ๊ธฐ ๋๋ฌธ์ ํน์ ๋ชจ๋ฅผ ์๊ธํญํ์ ์ฃผ์ํ์.
11. ํ ์ด๋ธ ํ์ธํ๊ธฐ
์์ฑ์ด ์๋ฃ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ๋ฉ๋ด์์ ์์ฑํ ์คํค๋ง๋ฅผ ํ์ธ ํ ์ ์๋ค.
Athena์์ ์ง์ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ง๋ ํ ์ด๋ธ๋ AWS Glue ํ ์ด๋ธ ์นดํ๋ก๊ทธ์ ์ ์ฅ๋๊ฒ ๋๋ค.
ํ๋ง๋๋ก Athena์ ํ ์ด๋ธ์ ์ฌ๊ธฐ์์ ๊ด๋ฆฌ๋๋ค๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Athena๋ก ํ ์ด๋ธ ์กฐํํ๊ธฐ
Glue ํฌ๋กค๋ฌ๋ก ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ Athena ์๋น์ค๋ก ์กฐํํด๋ณด์.
๊ทธ ์ด์ ์, ๋จผ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์์น๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค. ์ฐ์ธก์ ๋ณด๊ธฐ ์ค์ ์ ๋๋ฌ S3 ๊ฒฝ๋ก๋ฅผ ์ค์ ํด ์ฃผ์.
์ด์ Glue ํฌ๋กค๋ฌ์์ ์์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํด์ฃผ๋ฉด, ํ๋จ์ ํ ์ด๋ธ๋ช ์ด ๋ํ๋๊ฒ ๋๋ค.
ํ ์ด๋ธ ๋ด์ฉ์ ์กฐํํด ๋ณด์.
json์ ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ ํ์์ผ๋ก ์ ๋ณํ๋์ด ์กฐํ๋จ์ ํ์ธ ํ ์ ์๋ค.
์ด๋ฒ์๋ ์ฟผ๋ฆฌ์ ๋ด์ฉ์ ๋ฐ๊พธ์ด ์ง์ ํด๋ณด์.
SELECT * FROM "demo-athena-log"."athena_log_test_11" where user_id = 'bob'
๋ค์๊ณผ ๊ฐ์ด time ํ๋๋ฅผ ์์๋๋ก ์ ๋ ฌ์์ผ ์ง์ ํ๋ฉด ์๊ฐ๋ง๋ค ๋ก๊ทธ์ ์ํ๋ฅผ ๋ณผ์ ์๋ค.
SELECT * FROM "demo-athena-log"."athena_log_test_11"
where user_id = 'bob'
order by time desc
์ด๋ฒ์ action ํ๋๊ฐ 'insert'์ธ ์ฟผ๋ฆฌ๋ฅผ ์กฐํํด์ ์ง๊ณํจ์๋ก ์กฐํํด๋ณด์.
SELECT count(*)
FROM "demo-athena-log"."athena_log_test_11"
where user_id = 'bob' and action = 'insert'