ML/MLOps Engineer
[Spark] Cluster Sizing - ์ŠคํŒŒํฌ ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์ด์ฆˆ ์ •ํ•˜๊ธฐ

๋น…๋ฐ์ดํ„ฐ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์ด ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ๊ธฐ์—…๋“ค์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ํšจ์œจ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Apache Spark๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ปดํ“จํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ, ์ด๋Ÿฌํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Spark ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ์™€ ๊ตฌ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. 
 
์ด ๊ธ€์—์„œ๋Š” Spark ํด๋Ÿฌ์Šคํ„ฐ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ๊ณผ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒŒ์‹œ๊ธ€์€ Ganesh Walavalkar์˜ Spark Cluster Sizing ๊ฒŒ์‹œ๊ธ€์„ ์ •๋ฆฌํ•˜๋ฉฐ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.
 

Ask

๋ฐ์ดํ„ฐ ์ฆ๊ฐ€๋Ÿ‰๊ณผ ์†๋„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด์„œ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Assumptions (or given)

1. ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ: ์•ฝ 400TB, ์›” ์ฆ๊ฐ€๋Ÿ‰: ์•ฝ 30TB
2. ์ผ์ผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Ÿ‰: ์•ฝ 300TB (New: 30TB + Historical: 270TB)
3. 1TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์—๋Š” ์•ฝ 10๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 10๋ถ„์€ ์ฃผ๊ด€์ ์ธ ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋งค์ผ 300TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด 50์‹œ๊ฐ„(300*10๋ถ„, ๋งค์ผ ๋ฐค ๋นŒ๋“œ)๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. 10๋Œ€์˜ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด 50/10 -> ์•ฝ 5์‹œ๊ฐ„์œผ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค. data science ๊ด€๋ จ ์ž‘์—…, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์ž…์ถœ๋ ฅ, ์ฃผ๋ง ์ฒ˜๋ฆฌ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ/์žฌ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
4. ๋ฐ์ดํ„ฐ์˜ ๋‹ค์–‘์„ฑ/์ •ํ™•์„ฑ์€ ๊ณ„์‚ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
5. ๋ฐ์ดํ„ฐ๋Š” ๋กœ์ปฌ์— ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

Response

Calculations โ€” I (Starting with business requirements)

1. ๋…ธ๋“œ๋‹น Spark executor - 5 cores + ์ถ”๊ฐ€ 1๊ฐœ core (์›Œ์ปค ๋…ธ๋“œ์˜ OS์™€ execution management) = ์ด 6core
2. ๋…ธ๋“œ๋‹น Spark executor ๋ฉ”๋ชจ๋ฆฌ - 24GB(executor 1๊ฐœ๋‹น) * 5๊ฐœ์˜ executor = 120GB. OS ๋ฐ execution management๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ 5GB(๋ณดํ†ต 2GB) ๋ฅผ ์ถ”๊ฐ€ = ์ด 125GB
3. 1TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์—๋Š” โ€œper core & 25 GBโ€ ์˜ ์กฐํ•ฉ๋‹น 10๋ถ„ ~ 15๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ๋งค์šฐ ์ฃผ๊ด€์ ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๊ฐ€์ • 3๋ฒˆ์— ๋ช…์‹œ)
4. 300TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 300TB * 15๋ถ„ = 4500๋ถ„ or 75์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
5. ๋งค์ผ ๋ฐค ์ฒ˜๋ฆฌ๋ฅผ 6์‹œ๊ฐ„ ~ 7์‹œ๊ฐ„ ์ด๋‚ด๋กœ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 12๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ธ ๋ฒ„ํผ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 12Core/24TB/256GB ๋žจ์„ ๊ฐ–์ถ˜ 10๋Œ€์˜ ์„œ๋ฒ„๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
6. ํ•„์š”ํ•œ ๋””์Šคํฌ ๊ณต๊ฐ„
    - ๊ธฐ์กด: 400TB, ์ฆ๊ฐ€๋ถ„: 360TB (40TB*12), ์ด ~800TB
7. ์œ„์˜ 5๋ฒˆ๊ณผ ๊ฐ™์ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ 10๋Œ€์˜ ์„œ๋ฒ„๋กœ ์‹œ์ž‘๋œ๋‹ค๋ฉด, ์ด 800TB์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์„œ๋ฒ„๋‹น 80TB๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 Notes: (spark on yarn ์œผ๋กœ ๊ตฌ์„ฑ)
1. YARN์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•  ๋•Œ 0.5 ๋ฐฐ์ˆ˜์˜ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 1๋Œ€์˜ ์„œ๋ฒ„๋‹น ์š”๊ตฌ๋˜๋Š” ์ฝ”์–ด ์ˆ˜๋Š” 12๊ฐœ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” 6๊ฐœ์˜ ์›๋ž˜ ์ฝ”์–ด(1์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ)์— 2๋ฅผ ๊ณฑํ•œ ๊ฐ’ ์ž…๋‹ˆ๋‹ค. YARN์ด ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”์–ด ๋‹จ์œ„ ์ž…๋‹ˆ๋‹ค. ํ•œ ์„œ๋ฒ„์— 10๊ฐœ์˜ ์ฝ”์–ด๊ฐ€ ์žˆ์ง€๋งŒ YARN์—์„œ๋Š” 6๊ฐœ์˜ ์ฝ”์–ด๋กœ ์ธ์‹ํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. 
2. YARN์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•  ๋•Œ 0.5๋ฐฐ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 1๋Œ€์˜ ์„œ๋ฒ„๋‹น ์š”๊ตฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” 256GB ์ž…๋‹ˆ๋‹ค. 125GB์˜ ๋ฉ”๋ชจ๋ฆฌ(2์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ)์— 2 ๋ฅผ ๊ณฑํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. YARN์ด ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”์–ด ๋‹จ์œ„ ์ž…๋‹ˆ๋‹ค.
 
์„œ๋ฒ„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๊ณ„์‚ฐ์˜ ์‹œ์ž‘์ ์ด ์•Œ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 300TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด 20๋Œ€์—์„œ ์‹œ์ž‘ํ•ด์•ผํ• ๊นŒ์š”? 30๋Œ€์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ• ๊นŒ์š”? ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฐ˜๋ณต ๊ณ„์‚ฐ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Calculationsโ€” II (Starting with nodes)

1. node์˜ ์ˆ˜ 10
2. node๋‹น ์ฝ”์–ด ์ˆ˜ - 12
    - Spark application์šฉ ์ฝ”์–ด ์ˆ˜ 6(0.5 YARN multiplier)
    - spark management + OS ์šฉ ์ฝ”์–ด์ˆ˜ - 5
3. node ๋‹น ๋ฉ”๋ชจ๋ฆฌ - 256GB
    - spark application์šฉ ๋ฉ”๋ชจ๋ฆฌ(0.5 YARN multiplier) - 128GB
    - spark management + OS์šฉ - 8GB
    - ์ฝ”์–ด๋‹น ๋‚จ์€ ๋ฉ”๋ชจ๋ฆฌ (120/5) 24GB
4. ํด๋Ÿฌ์Šคํ„ฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด ์ฝ”์–ด ์ˆ˜ - 50(5*10)*0.9 = 45 (0.1์˜ ํšจ์œจ ์†์‹ค์„ ๊ณ ๋ คํ•จ)
5. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜ - 1.2TB (120GB * 10) * 0.9 = 1.08TB (0.1์˜ ํšจ์œจ ์†์‹ค์„ ๊ณ ๋ คํ•จ)
์ฝ”์–ด๋‹น 1TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์— 15๋ถ„์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์ด ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์‹œ๊ฐ„๋‹น ๋…ธ๋“œ๋‹น 4TB ์ฆ‰ ์‹œ๊ฐ„๋‹น ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ 40TB๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 300TB๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ์—๋Š” ์•ฝ 8์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
 

Putting it together

1. 12Core/Storage 24tb/memory 256GB ๊ตฌ์„ฑ์˜ 10๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
2. ์ €์žฅ๊ณต๊ฐ„์œผ๋กœ๋Š” ๋ณ„๋„์˜ ๋””์Šคํฌ ์Šคํ† ๋ฆฌ์ง€ ์„œ๋ฒ„๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Outro

์ด ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ์ŠคํŒŒํฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ธํ”„๋ผ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ์œ„ํ•œ ์ˆœ์ฐจ์ ์ธ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹จ์œ„ ์„œ๋ฒ„๋‹น ํ•„์š”ํ•œ ์ž์›์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์„ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๊ณ  ๊ธฐ์ค€ ์‹œ๊ฐ„์„ ๊ตฌํ•œ ํ›„์— ์ „์ฒด ํ•„์š”ํ•œ ์‚ฌ์–‘์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „์ฒด ์‚ฌ์–‘์„ ๊ณ„์‚ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.