ETL? AWS Glue๋ก ๊ฐํธํ๊ฒ! (๋์ด๋: ๋งค์ฐ ์ฌ์) - AWS Glue Studio ์ฐ๋จนํ๊ธฐ
![ETL? AWS Glue๋ก ๊ฐํธํ๊ฒ! (๋์ด๋: ๋งค์ฐ ์ฌ์) - AWS Glue Studio ์ฐ๋จนํ๊ธฐ](https://static.wixstatic.com/media/3aac70_0be044231fea4a69bc75ff7a947ff66c~mv2.png/v1/fill/w_49,h_37,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_0be044231fea4a69bc75ff7a947ff66c~mv2.png)
Written by Minhyeok Cha
์ต๊ทผ ํ์ฅ๋๊ป์ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋ํด ๋ง์ ๊ด์ฌ์ ๊ฐ๊ณ ๊ณ์ ๋ฐ, ๋ฐ์ดํฐ ๋ณํ ์๋ํ์ ๋ํด ์ด์ผ๊ธฐ ํ ๋๋ง๋ค ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์๊ฐ๋์ง ์ด๋ ต๋ค๊ณ ํ์ จ์ต๋๋ค. ๋ํ ๊ณ ๊ฐ์ผ๋ก๋ถํฐ AWS Glue๋ฅผ ์ถ์ฒ๋๋ ค๋ ์ด๋ ค์์ ์ฌ์ฉํ๊ธฐ ๊บผ๋ ค์ง๋ค๋ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ด์ผ๊ธฐ๋ฅผ ๋ฃ๊ณ AWS๋ฅผ ์ด์ฉํ์๋ ๋ถ๋ค์ด Glue์ ๋ํด ๋๋ฌด ๋ฌด๊ฒ๊ฒ ์๊ฐํ์ง ์๊ฒ ํ๊ณ ์ ์ด๋ฒ ๋ธ๋ก๊ทธ๋ฅผ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
AWS Glue
์๋น์ค ์๊ฐ
AWS Glue๋ ๊ฐ๋จํ ๋งํด ETL ์๋น์ค์ ๋๋ค. ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ํด์ ์ข ์ฌ์๋ถ๋ค์ด ์๋ ๋ถ๋ค์ ๋ฌด์กฐ๊ฑด ์ด๋ ต๋ค๊ณ ์๊ฐํ์๋๋ฐ ๋ฐ์ ๋ง๊ณ ๋ฐ์ ํ๋ ธ๋ค๊ณ ์๊ฐํฉ๋๋ค.
AWS Glue์์๋ Script๋ฅผ Visualizing ํ์ฌ ์ค์ ์ด ํธํ๊ณ ์ฝ์ต๋๋ค. ๋ํ AWS ์๋น์ค์ด๊ธฐ์ ๋ค๋ฅธ AWS ์๋น์ค์์ ์ฐ๋์ฑ๋ ๋ฐ์ด๋๋ฉฐ S3, RDS, DynamoDB ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ฐ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ AWS Glue๋ฅผ ์ ํํ๋๊ฐ
ETL์ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๊ณ ๊ฐ์ด ์๋๋ฐ ์คํ ์์ค๋ฅผ ์ฌ์ฉํ ETL ๊ณผ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ฒ์๋ถํฐ ์ํคํ ์นญ์ ํด์ผ ํ๋ฉฐ ๊ทธ ํด์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ตํ๊ธฐ๊น์ง ๋ง์ ์๊ฐ์ด ๋ญ๋๋ค.
์์๋ก ElasticStack ์ฌ์ฉํ ETL ๊ตฌ์กฐ์ ๋๋ค.
![ElasticStack์ ์ฌ์ฉํ ETL ๊ตฌ์กฐ](https://static.wixstatic.com/media/3aac70_94fb8b31d10a475597cd0f72367da93d~mv2.png/v1/fill/w_69,h_18,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_94fb8b31d10a475597cd0f72367da93d~mv2.png)
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉ์์ ๋ชฉ์ ์ฑ์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ฌํญ์ ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์.
๋ฐ์ดํฐ ์์ง์ ์ํ API๋ ํฌ๋กค๋ง ์คํฌ๋ฆฝํธ ์์ฑ์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ง
logstash๋ก ์ ๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ ํตํฉ์ํจ ํ Elasticsearch์ ์ ์ฅ
์ดํ ๋ฐ์ดํฐ ๋ถ์์ ์ํด Elasticsearch API๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ python ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ ๋ถ์์ ์งํ ํ ๋ค์ export
ElasticStack flow๋ฅผ ๋ณด๋ฉด ์ฌ์ค Glue์ ๋น๊ตํ ๋งํ ์๋น์ค๋ logstach์ ๋๋ค.
![elastic ํํ์ด์ง์์ ๋ฐ์ทํ Logstach์ ETL](https://static.wixstatic.com/media/3aac70_c8b379498b7b4289a42a9badc2cd616c~mv2.png/v1/fill/w_49,h_19,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_c8b379498b7b4289a42a9badc2cd616c~mv2.png)
Logstash๋ ์ฌ์ฉ์๊ฐ ์ง์ ์๋ฒ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ง ๊ทธ๋๋ก ์๋ฒ๋ฅผ ์ด์ด ์ด๊ธฐ ์ธํ ์ด ํ์ํ๋ค ๊ฒ์ด ๋จ์ ์ ๋๋ค. ๋ํ Filter์์ ์ง์ํ๋ Plugin์ด๋ ์ฌ์ฉ ๋ฐฉ๋ฒ ๋ฑ ๋ง์ ๋ด์ฉ์ ๊ณต๋ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์ต์์ง ์๋ค๋ฉด ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ AWS Glue๋ ๊ด๋ฆฌํ ์๋น์ค๋ก์ ์ฌ์ฉ์๊ฐ ์๋ฒ๋ ์ธํ๋ผ๋ฅผ ์ง์ ๊ด๋ฆฌํ ํ์๊ฐ ์๊ณ Filter ๊ณผ์ ์ด ์ ํํ ๋์ด์๋ ํธ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
โป ์์์ ์์ ํ ๋จ์ ๋ง ์ธ์ ์ฌ๋ฌ ์ฅ์ ๋ ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ด๋ป๊ฒใป์ด๋ค ๋ชฉ์ ์ผ๋ก ํ์ฉํ๋์ง์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ํด์ ๋ฌ๋ฆฌํ ์ ์์ต๋๋ค.
AWS Glue Studio ๋ฐ ์ฐ๋จนํด๋ณด๊ธฐ
AWS Glue๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์์ Glue Studio๋ผ๋ ๋ ์์ ์๊ณ ๊ฐ์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์ํ์ด์ ์ค๋ฉ๊ฐ์ ๋๋ค.
์๋๋ฉด ETL์ ์ฌ์ฉํ๋ ค๊ณ Glue๋ฅผ ์ฐ๋๋ฐ AWS Glue Studio๊ฐ ์ค์น ๋ฐ ์ธํ ๊ณผ์ ์ ์ ๋ถ ์ ํํ ์์ผ๋์ด ๊ฐํธํ๊ฒ ์ฌ์ฉ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋๋ ๊ธฐ๋ฅ์ ์ฐ๊ธฐ ์ํด์ ์์์ผ ํ ๊ฒ์ด ์์ผ๋ ์์ฃผ ์กฐ๊ธ๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
![์ฐ๋จนํด๋ณผ ์ํคํ
์ฒ](https://static.wixstatic.com/media/3aac70_8f9bb056cce3426ba1f0f75df8f347d2~mv2.png/v1/fill/w_80,h_34,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_8f9bb056cce3426ba1f0f75df8f347d2~mv2.png)
์ฌ์ ์ค๋น
1. S3์ ๋ฐ์ดํฐ ์ ๋ฃ๊ธฐ
![๋ฐ์ดํฐ ์
S3์ ๋ฃ๊ธฐ: Raw ๋ฒํท์ ๋ฐ์ดํฐ ์
์ ์ฝ์
ํฉ๋๋ค.](https://static.wixstatic.com/media/3aac70_3316e9d7af6a4aee8a74c04e28fa7577~mv2.png/v1/fill/w_48,h_13,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_3316e9d7af6a4aee8a74c04e28fa7577~mv2.png)
๊ฐ Data Source์ Target Data์ ์ํ ๋ฒํท์ ๋๋ค.
Raw ๋ฒํท์ ๋ฐ์ดํฐ ์ ์ ์ฝ์ ํฉ๋๋ค. (์ด๋ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์๊ฐ ํ๊ฐํ ๋น๋์ค ๊ฒ์์ ๋๋ค)
2. Data Catalog ๋ฐ Crawlers ์์ฑ
Glue Crawler๋ ์คํ ๋ฆฌ์ง๋ DB๋ฅผ ํ์ํ๋ฉด์ ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ์ ์ํ๊ณ , ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ดํฐ๋ก ํ์ฌย Data Catalog์ ๊ธฐ๋กํฉ๋๋ค.
Data Catalog์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
![Data Catalog์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ](https://static.wixstatic.com/media/3aac70_e5109193eab24821b6db332a52e4328e~mv2.png/v1/fill/w_49,h_9,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_e5109193eab24821b6db332a52e4328e~mv2.png)
๋น์ฅ์ ๊ป๋ฐ๊ธฐ์ธ DB์ ๋๋ค.
Crawlers ์์ฑ
![Crawlers ์์ฑ: S3 ๋ฒํท ์ง์ ](https://static.wixstatic.com/media/3aac70_9286d349429740cea031f2e7e385c8bf~mv2.png/v1/fill/w_61,h_40,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_9286d349429740cea031f2e7e385c8bf~mv2.png)
![Crawlers ์์ฑ: Target DB ์ง์ ](https://static.wixstatic.com/media/3aac70_20a1eecb526040a79e4aec6627ca32f1~mv2.png/v1/fill/w_73,h_16,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_20a1eecb526040a79e4aec6627ca32f1~mv2.png)
์ฌ์ ์ ๋ง๋ค์ด๋ S3 ๋ฒํท๊ณผ DB๋ฅผ ์ง์ ํด ์ค๋๋ค.
![ํฌ๋กค๋ฌ ์์ฑ ํ ์คํ ์, S3 ๋ฒํท ์์ ์๋ ๋ฐ์ดํฐ ์
์ ํฌ๋กค๋งํ์ฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฌํฉ๋๋ค.](https://static.wixstatic.com/media/3aac70_a6c820ae96be4737b7a1b7bec2070fa1~mv2.png/v1/fill/w_49,h_20,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_a6c820ae96be4737b7a1b7bec2070fa1~mv2.png)
ํฌ๋กค๋ฌ ์์ฑ ํ ์คํ์ ํ๋ฉด, S3 ๋ฒํท ์์ ์๋ ๋ฐ์ดํฐ ์ ์ ํฌ๋กค๋งํ์ฌ ๋ฉํํ ์ดํฐ๋ฅผ DB์ ์ ์ฌํฉ๋๋ค.
Glue Studio
์ฌ์ ์ค๋น๋ ๋๋ฌ์ผ๋ ์ง์ง Glue๋ฅผ ํ์ธํ๋ฌ ๊ฐ๋ด ๋๋ค.
![AWS Glue Studio](https://static.wixstatic.com/media/3aac70_1be5782d79c44cb4b62c0c2a3512ba5a~mv2.jpg/v1/fill/w_147,h_79,al_c,q_80,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_1be5782d79c44cb4b62c0c2a3512ba5a~mv2.jpg)
๊ฐ ๋ ธ๋๋ฅผ ์ฌ์ฉํ์ฌ ETL์ ๊ตฌ์ถ
๊ฐ ์์ค์ ํ๊ฒ์ด ๋๋ ์๋ํฌ์ธํธ ์ง์
๋ฐ์ดํฐ ๋ณํ ๋ฐ ETL ์์ ์ ์ํ ๋ณต์กํ ์ฝ๋ ์์ฑ ์์ด๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถ
์ง์ ํ ๋ ธ๋ ์ด๋ฆ, ์๋ํฌ์ธํธ ๊ฐ, ๋ณํ ์์ ๋ด์ฉ ๋ฑ ๊ธฐ์
ETL Workflow ํ์ธ ํ ์ ์ฅ - ์คํ
![apache spark script](https://static.wixstatic.com/media/3aac70_7b5b16695e71497693c745c3aa42b441~mv2.png/v1/fill/w_49,h_17,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_7b5b16695e71497693c745c3aa42b441~mv2.png)
์์์ ์์ ํ ๋ชจ๋ ๊ณผ์ ์ apache spark scriptํ ๋์ด ๊ธฐ๋ก์ด ๋๊ณ ์ถ๊ฐ๋ก visual node์์ ์๋ ๋ณํ ๊ธฐ๋ฅ์ ์ฝ๋ฉ์ผ๋ก ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค
๊ฒฐ๊ณผ
์ ์ํฌํ๋ก์ฐ์์ ์ฌ์ฉํ ๋ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
![DynamicFrame์ DataFrame์ผ๋ก ๋ณํ โ DataFrame์์ ๊ฒฐ์ธก๊ฐ(null)์ ์ ๊ฑฐํฉ๋๋ค.](https://static.wixstatic.com/media/3aac70_d58f02651cc340e69892ed40246374c0~mv2.png/v1/fill/w_49,h_19,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_d58f02651cc340e69892ed40246374c0~mv2.png)
DynamicFrame์ DataFrame์ผ๋ก ๋ณํ โ DataFrame์์ ๊ฒฐ์ธก๊ฐ(null)์ ์ ๊ฑฐํฉ๋๋ค. (์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ PySpark ์ฝ๋๋ฅผ ์ฝ๋ ๋ธ๋ก์ ์์ฑํ์ฌ ์งํ)
![Filter๋ฅผ ํตํด user score ์ ์๊ฐ 8์ ์ด์์ธ ๊ฒ์ ๋ชฉ๋ก๋ง์ ์ถ๋ ฅํฉ๋๋ค.](https://static.wixstatic.com/media/3aac70_6963bc91d86641c6a2ea0fae6b8e4688~mv2.png/v1/fill/w_49,h_21,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_6963bc91d86641c6a2ea0fae6b8e4688~mv2.png)
Filter๋ฅผ ํตํด user score ์ ์๊ฐ 8์ ์ด์์ธ ๊ฒ์ ๋ชฉ๋ก๋ง์ ์ถ๋ ฅํฉ๋๋ค. ๊ธฐ์กด์ 200๊ฐ์ ๊ฒ์ ๋ชฉ๋ก์์ Null ๊ฐ์ ์ ์ธํด 162๊ฐ๋ก ์ค์ด๊ณ , 8์ ์ด์์ ๊ฒ์์ ์กฐํํ์ฌ ์ด 30๊ฐ์ ๊ฒ์์ ์ฐพ๋ ๋ฐ ์ฑ๊ณตํ์์ต๋๋ค.
![Target ๋ฒํท์ ํ์ธํฉ๋๋ค.](https://static.wixstatic.com/media/3aac70_d4c41898d49246ec97740a2fa42d3314~mv2.png/v1/fill/w_49,h_28,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/3aac70_d4c41898d49246ec97740a2fa42d3314~mv2.png)
Target ๋ฒํท์ ํ์ธํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
์์์๋ ๋ฑ ํ ๋ฒ ์ธ๊ธ์ ํ์ง๋ง Glue๋ Apache Spark ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์ด ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ์ํํฉ๋๋ค.
๋ฐ์ดํฐ์ ETL์ ๋ชฉ์ ์ฑ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ค์ํฉ๋๋ค. ์์๋ก ๋ฐ์ดํฐ ์ ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด๋ฅผ ์ปฌ๋ผ๋ผ๋ฆฌ ๋ฌถ์ผ๋ ค๊ณ ํ๋ฉด ๊ท์ฐฎ์์ง๊ธฐ ์์ํฉ๋๋ค. ์ฌ์ค ์ด ๋ถ๋ถ๋ ์์ธํ๊ฒ ๋ณด์ฌ๋๋ฆฌ๊ณ ์ถ์์ผ๋ ์ ๊ฐ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ํ์ผ์ด ๋จ์ผ ๋ฐ์ดํฐ ์ ์ด๋ผ ์ ๋ชฉํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ ํ๋ค์ด ํจ์คํ์ต๋๋ค.
์ด๋ฒ ๋ธ๋ก๊ทธ์ ์ปจ์ ์ ์ฐ๋จน์ด๋ผ Glue์ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๊ธฐ๋ฅ๋ง ์๊ฐํ๋ ค ํ์ง๋ง, Apache Spark์ RDD, Dataframe, Data set ์ ๋๋ ์์๋๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ์ ์ผ๋ถ ์์ ์ ๋ฃ์ด ๋ดค์ต๋๋ค.