๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Work Logs/Problem Solving | Dev in Practice

82,450๊ฑด insert ๋ณ‘๋ชฉ ์ด์Šˆ ํ•ด๊ฒฐ๊ธฐ

by novxerim 2025. 4. 18.

ํ•ด๊ฒฐ๊ธฐ

๐Ÿงฉ ๋ฌธ์ œ ์ƒํ™ฉ

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
  1. DynamoDB (Table A / Table B)
    • Table A์—์„œ ์žฅ๊ธฐ ๋ฏธ์ ‘์† ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๋Š” ์œ ์ € ์ „์ฒด export
    • Table B๋„ ํ•จ๊ป˜ exportํ•˜์—ฌ ๋น„๊ต ๊ธฐ๋ฐ˜ ๋งˆ๋ จ
  2. S3์— ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ
    • DynamoDB dump ๋ฐ์ดํ„ฐ๋ฅผ .parquet ๋˜๋Š” .csv ํฌ๋งท์œผ๋กœ ์ €์žฅ
    • ์ง€์ •๋œ S3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ
  3. AWS Glue ์ž‘์—…
    • Glue Job์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ œ ๋ฐ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ๊ตฌ์„ฑ
    • Glue Crawler๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ์— ํ…Œ์ด๋ธ” ๋“ฑ๋ก
  4. 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
    );
  5. 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๋ฅผ ํ™œ์šฉํ•œ ๋Œ€๊ทœ๋ชจ ์œ ์ € ๊ฒ€์ถœ์ด ์œ ์šฉํ–ˆ์Œ
  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์‹œ ์‹ค์ œ ์„œ๋น„์Šค ์ƒํƒœ ์žฌํ˜„์˜ ์ค‘์š”์„ฑ ์žฌํ™•์ธ
  • ์–ด๋“œ๋ฏผ๊ณผ ์Šคํฌ๋ฆฝํŠธ ๋กœ์ง ์‚ฌ์ด์˜ ์ผ๊ด€์„ฑ ํ™•๋ณด ํ•„์š”
  • ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ์‹คํ–‰์‹œ์—๋„ ๋””ํ…Œ์ผํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ๋งŽ์Œ


์ด ํฌ์ŠคํŠธ๋Š” ์‹ค์ œ ์‹ค๋ฌด์—์„œ ๊ฒช์—ˆ๋˜ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‚ฌ๋ก€๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ ๋ฐœ๊ฒฌ์‹œ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฌ๊ณ , ๋”ฐ๋œปํ•œ ์กฐ์–ธ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :)

๋Œ“๊ธ€