ํด๊ฒฐ๊ธฐ
๐งฉ ๋ฌธ์ ์ํฉ
2023๋ 10์ ๋ง๋ถํฐ 11์ ๋ง๊น์ง, ํน์ ๊ธฐ๊ฐ ๋์ ์ ๊ท 'A' id๊ฐ ์์ฑ ์ ์ฅ๊ธฐ ๋ฏธ์ ์์๋ก ์ ํ ์ฒ๋ฆฌํ๋ ๋ก์ง์์ ์ฅ๊ธฐ ๋ฏธ์ ์์ ์ ์ฉ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋๋ ํ์์ด ๋ฐ์ํ๋ค.
- ์์ธ: ์ฅ๊ธฐ ๋ฏธ์ ์์๋ก ์ ํ ์ฒ๋ฆฌํ๋ ๊ธฐ์กด ์คํฌ๋ฆฝํธ์์ INSERT IGNORE ๊ตฌ๋ฌธ์ด ๋๋ฝ๋์ด, ์ค๋ณต๋ ํน์ id๊ฐ์ด ์๋ฌ๋ฅผ ์ ๋ฐํจ.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ 82,450๋ช
์ ์ ์ ๊ฐ Table A์์๋ ์ฅ๊ธฐ ๋ฏธ์ ์ ์ฒ๋ฆฌ ์ํ์ด์ง๋ง, ๋ณ๋๋ก ์ฅ๊ธฐ ๋ฏธ์ ์์๋ฅผ ๊ด๋ฆฌํ๋ Table Bํ
์ด๋ธ์๋ ์กด์ฌํ์ง ์์.
๐ ๋ฌธ์ ์ธ์ง
- CS ์ธ์ ๊ณผ ์๋ฌ๋ก๊ทธ๋ฅผ ํตํด ์ด์ ์ธ์ง
- ๊ด๋ จ ์ปค๋ฐ ๋น๊ต ๋ฐ ๋๋ฝ๋ ์ฟผ๋ฆฌ ํ์ธ
๐ ๋ฌธ์ ์ง๋จ (์์ธ ํ์ฅ ๋ฒ์ )
๋จ์ SQL๋ก๋ 8๋ง ๊ฑด ์ด์์ ์ ์ ์ํ๋ฅผ ์ง์ ํ์ธํ๊ณ ๋น๊ตํ๊ธฐ ์ด๋ ค์ ๊ธฐ ๋๋ฌธ์,
Athena ๊ธฐ๋ฐ์ ๋ถ์ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด ๋ฌธ์ ์ ์ ๋ฅผ ์ถ์ถํ๋ค.
๐ ๏ธ ํ์ฉํ ๋ถ์ ํ๋ฆ
DynamoDB → S3 → Glue → Data Catalog(Crawler & Job) → Athena → Zeppelin
- DynamoDB (Table A / Table B)
- Table A์์ ์ฅ๊ธฐ ๋ฏธ์ ์ ์ํ ์ฒ๋ฆฌ๊ฐ ๋์ด์๋ ์ ์ ์ ์ฒด export
- Table B๋ ํจ๊ป exportํ์ฌ ๋น๊ต ๊ธฐ๋ฐ ๋ง๋ จ
- S3์ ๋ฐ์ดํฐ ์
๋ก๋
- DynamoDB dump ๋ฐ์ดํฐ๋ฅผ .parquet ๋๋ .csv ํฌ๋งท์ผ๋ก ์ ์ฅ
- ์ง์ ๋ S3 ๋ฒํท์ ์ ๋ก๋
- AWS Glue ์์
- Glue Job์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ ๋ฐ ํ ์ด๋ธ ์คํค๋ง ๊ตฌ์ฑ
- Glue Crawler๋ฅผ ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์นดํ๋ก๊ทธ์ ํ ์ด๋ธ ๋ฑ๋ก
- Athena ๋ถ์ ํ๊ฒฝ ๊ตฌ์ฑ
- Glue Data Catalog์ ๋ฑ๋ก๋ ํ ์ด๋ธ์ Athena์์ ๋ฐ๋ก ์กฐํ ๊ฐ๋ฅํ๋๋ก ์ค์
- ์๋์ ๊ฐ์ SQL์ ํ์ฉํด ๋ฌธ์ ์ ์ ํํฐ๋ง
SELECT id FROM parquet.table_A WHERE game = '2' AND ์ฅ๊ธฐ ๋ฏธ์ ์์ ์ฒ๋ฆฌ ์ํ = true AND id NOT IN ( SELECT id FROM table_B );
- Zeppelin์์ ์๊ฐํ ๋ฐ ๊ฒฐ๊ณผ ์ ๋ฆฌ
- Athena SQL ๊ฒฐ๊ณผ๋ฅผ Zeppelin์ ์ฐ๋ํ์ฌ,
- ๋ฐ์ดํฐ ํ์ธ ๋ฐ ๋ถ์ ํ ์ด์ ํด๊ฒฐ ์ฒ๋ฆฌ
๐จ ํด๊ฒฐ ๊ณผ์
1. ์คํฌ๋ฆฝํธ ์์ฑ ๋ฐ ํ ์คํธ
- ๋์์ ์ถ์ถ: Athena ํตํด ์ถ์ถ๋ ์ฝ 82,450๋ช
- ๊ฐ ์ ์ ๋ค์ ๊ณ ์ id์ ๋ํด Table C(ํ๋ซํผ ๋ฐ์ดํฐ ๊ด๋ จ ํ ์ด๋ธ)์์ 'B' id ์กฐํ
- Table B(์ฅ๊ธฐ๋ฏธ์ ์์ ๊ด๋ฆฌ ํ ์ด๋ธ)์ insert, ๋๋ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌ
2. ํ ์คํธ ํ๊ฒฝ ๊ฒ์ฆ
- Stage ์๋ฒ์ ํ ์คํธ ์ ์ ๊ตฌ์ฑ
- ์ฌ์ฉ์ ์ํ, ์ฐ๊ฒฐ ํ ์ด๋ธ ๋ฐ์ดํฐ(Table D, Table E) ์ ์ด์ ์ฌํ ์ธํ ํ ํ ์คํธ ์งํ
3. ์คํฌ๋ฆฝํธ ์คํ
- INSERT IGNORE ์ ์ฉ
- update ์ ์ ์ ์ ์ํ๋ฅผ ์ฅ๊ธฐ ๋ฏธ์ ์ ์ํ๋ก ๋ณ๊ฒฝ ์ฒ๋ฆฌ
- QA ํ ์คํธ ๊ณ์ ์ ์ ์ฐ๋ ํ์ธ ํ, ์ ์ด์ ์ ์ ๋์ ์คํฌ๋ฆฝํธ ์คํ
4. ๊ธฐํ ๊ณ ๋ ค ์ฌํญ
- ์คํฌ๋ฆฝํธ ์คํ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆด ๊ฒ์ผ๋ก ์์๋์ด ๋ฎ(๊ทผ๋ฌด ์๊ฐ)์ ์คํ์ํฌ์ง, ์ ์ ๊ฐ ์ ์ ์๊ฐ๋์ ์คํ ์ํฌ์ง๋ ๊ณ ๋ฏผ์ด์๋ค.
- ์ฅ๊ธฐ๋ฏธ์ ์์ ์ฒ๋ฆฌ๊ฐ์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ ๋์ค ์ ์ ๊ฐ ์ ์ํด๋ ๊ด์ฐฎ๋ค๊ณ ํ๋จ
- ๋์ค์ ์ ์ํด์ ์ ์ ์ํ๊ฐ ํ์ฑํ ๋ ์ ์ ๋ ์คํฌ๋ฆฝํธ ๋์์์ ์์ฐ์ค๋ฝ๊ฒ ์ ์ธ๋จ
- 82,450๊ฑด์ ์ฒ๋ฆฌ์ธ๋ฐ, ๋ช ๊ฑด์ฉ ๋๋์ด ์ฒ๋ฆฌ ํ sleep ์ํฌ ๊ฑด์ง (5,000๊ฑด์ฉ selectํ ์ฒ๋ฆฌ๋ 1,000๊ฑด์ฉ ์งํํ์๋ค)
5. ๊ฒฐ๊ณผ
- Table C ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก 'A' id๊ฐ ๋ณต๊ตฌ ์ฑ๊ณต
- ์ฝ 79,787๊ฑด insert ์๋ฃ, ์ค๋ฅ ์์ด ์ฒ๋ฆฌ๋จ
๐ ์ธ์ฌ์ดํธ & ํ๊ณ
- ๋จ์ ์ฟผ๋ฆฌ ํ ์ค ๋๋ฝ์ผ๋ก ์ธํด ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋๋ฝ ๋ฐ duplicated ์๋ฌ ๋ฐ์ ๊ฐ๋ฅ
- INSERT IGNORE ๊ฐ์ ์์ ๋ฐฉ์ด ๋ก์ง์ ์ค์์ฑ ์ธ์ง
- Athena๋ฅผ ํ์ฉํ ๋๊ท๋ชจ ์ ์ ๊ฒ์ถ์ด ์ ์ฉํ์
- ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ ์ ์ค์ ์๋น์ค ์ํ ์ฌํ์ ์ค์์ฑ ์ฌํ์ธ
- ์ด๋๋ฏผ๊ณผ ์คํฌ๋ฆฝํธ ๋ก์ง ์ฌ์ด์ ์ผ๊ด์ฑ ํ๋ณด ํ์
- ์คํฌ๋ฆฝํธ ์์ฑ ๋ฐ ์คํ์์๋ ๋ํ
์ผํ๊ฒ ๊ณ ๋ คํด์ผํ ๋ถ๋ถ์ด ๋ง์
์ด ํฌ์คํธ๋ ์ค์ ์ค๋ฌด์์ ๊ฒช์๋ ๋์ฉ๋ ํธ๋ฌ๋ธ์ํ ์ฌ๋ก๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
๋ฌธ์ ๋ฐ๊ฒฌ์ ๋๊ธ ๋ถํ๋๋ฆฌ๊ณ , ๋ฐ๋ปํ ์กฐ์ธ์ ์ธ์ ๋ ํ์์ ๋๋ค :)
'Work Logs > Problem Solving | Dev in Practice' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SELECT COUNT ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ํ๋๊ธฐ: 9.46ms โ 3.52ms (1) | 2025.06.14 |
---|
๋๊ธ