์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด Dataflow๊ฐ€ ์ž‘์—…์— ์ ์ ˆํ•œ ์ž‘์—…์ž ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ž‘์—…์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. Dataflow๋Š” ์ž‘์—…์ž์˜ ํ‰๊ท  CPU ์‚ฌ์šฉ๋ฅ ๊ณผ ํŒŒ์ดํ”„๋ผ์ธ ๋™์‹œ ๋กœ๋“œ์— ๋”ฐ๋ผ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ๋™์‹œ ๋กœ๋“œ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์Šค๋ ˆ๋“œ ์˜ˆ์ธก ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์€ ์ผ๊ด„ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ชจ๋‘์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ผ๊ด„ ์ž๋™ ํ™•์žฅ

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

์ž‘์—…์ž ์ˆ˜๋Š” ์ž‘์—…๋Ÿ‰์— ์ €์„ ํ˜•์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์—…๋Ÿ‰์€ ๋‘ ๋ฐฐ์ธ๋ฐ ์ž‘์—…์ž ์ˆ˜๋Š” ๋‘ ๋ฐฐ๋ณด๋‹ค ์ ์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด Dataflow๋Š” ์œ ํœด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์ž ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์ค„์ž…๋‹ˆ๋‹ค.

  • ํ‰๊ท  ์ž‘์—…์ž CPU ์‚ฌ์šฉ๋Ÿ‰์ด 5% ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.
  • ๋™์‹œ ๋กœ๋“œ๋Š” ์••์ถ• ํŒŒ์ผ๋กœ ์ธํ•œ ๋ถ„ํ• ํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ ๋˜๋Š” ๋ถ„ํ• ๋˜์ง€ ์•Š์€ I/O ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๋™์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋™์‹œ ๋กœ๋“œ ์ˆ˜๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Cloud Storage์˜ ๊ธฐ์กด ํŒŒ์ผ์— ์“ฐ๋Š” ๊ฒฝ์šฐ).

์ž‘์—…์ž ์ˆ˜์˜ ์ƒํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด --maxNumWorkers ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์„ ์„ค์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 2,000์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ž ์ˆ˜์˜ ํ•˜ํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด --min_num_workers ์„œ๋น„์Šค ์˜ต์…˜์„ ์„ค์ •ํ•˜์„ธ์š”. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ์ž๋™ ํ™•์žฅ

์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด Dataflow๊ฐ€ ๋กœ๋“œ ๋ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์ ์‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Streaming Engine์„ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์— ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Streaming Engine์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์— ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹œ์ž‘ํ•  ๋•Œ ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์„ ์„ค์ •ํ•˜์„ธ์š”.

Java

--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS

MAX_WORKERS๋ฅผ ์ตœ๋Œ€ ์ž‘์—…์ž ์ธ์Šคํ„ด์Šค ์ˆ˜๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

Python

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

MAX_WORKERS๋ฅผ ์ตœ๋Œ€ ์ž‘์—…์ž ์ธ์Šคํ„ด์Šค ์ˆ˜๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

Go

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

MAX_WORKERS๋ฅผ ์ตœ๋Œ€ ์ž‘์—…์ž ์ธ์Šคํ„ด์Šค ์ˆ˜๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ž‘์—…์ž ์ˆ˜์˜ ํ•˜ํ•œ์„ ์„ค์ •ํ•˜๋ ค๋ฉด --min_num_workers ์„œ๋น„์Šค ์˜ต์…˜์„ ์„ค์ •ํ•˜์„ธ์š”. ์ด ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์ด ์ง€์ •๋œ ์ž‘์—…์ž ์ˆ˜ ๋ฏธ๋งŒ์œผ๋กœ ํ™•์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ ์ค‘์ง€

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Java

--autoscalingAlgorithm=NONE

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ฉด Dataflow๋Š” --numWorkers ์˜ต์…˜์— ๋”ฐ๋ผ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Python

--autoscaling_algorithm=NONE

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ฉด Dataflow๋Š” --num_workers ์˜ต์…˜์— ๋”ฐ๋ผ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Go

--autoscaling_algorithm=NONE

์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ฉด Dataflow๋Š” --num_workers ์˜ต์…˜์— ๋”ฐ๋ผ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์†Œ์Šค

์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java

์ œํ•œ๋œ ์†Œ์Šค

  • BoundedSource ์„œ๋ธŒํด๋ž˜์Šค์—์„œ getEstimatedSizeBytes ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” ํŒŒ์ดํ”„๋ผ์ธ์— ์‚ฌ์šฉํ•  ์ดˆ๊ธฐ ์ž‘์—…์ž ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ getEstimatedSizeBytes์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • BoundedReader ์„œ๋ธŒํด๋ž˜์Šค์—์„œ getFractionConsumed ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” getFractionConsumed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ณ  ์ฝ๋Š” ์ค‘์— ์‚ฌ์šฉํ•  ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์ˆ˜๋ ดํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์†Œ์Šค

์†Œ์Šค๋Š” Dataflow ์„œ๋น„์Šค์— ๋ฐฑ๋กœ๊ทธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๋กœ๊ทธ๋Š” ์†Œ์Šค์—์„œ ์•„์ง ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ์ถ”์ •์น˜(๋ฐ”์ดํŠธ ๋‹จ์œ„)์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค์— ๋ฐฑ๋กœ๊ทธ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด UnboundedReader ํด๋ž˜์Šค์—์„œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ ๋‘ ๊ฐœ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • getSplitBacklogBytes() - ํ˜„์žฌ ์†Œ์Šค ๋ถ„ํ• ์— ๋Œ€ํ•œ ๋ฐฑ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ๋ชจ๋“  ๋ถ„ํ• ์— ๊ฑธ์ณ ๋ฐฑ๋กœ๊ทธ๋ฅผ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • getTotalBacklogBytes() - ๋ชจ๋“  ๋ถ„ํ• ์— ๊ฑธ์นœ ์ „์ฒด ๋ฐฑ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ถ„ํ• ์— ๋Œ€ํ•œ ๋ฐฑ๋กœ๊ทธ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๋ถ„ํ• ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ„ํ• (๋ถ„ํ•  ID '0')๋งŒ ์ „์ฒด ๋ฐฑ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Apache Beam ์ €์žฅ์†Œ์—๋Š” UnboundedReader ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ปค์Šคํ…€ ์†Œ์Šค ์˜ˆ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Python

์ œํ•œ๋œ ์†Œ์Šค

  • BoundedSource ์„œ๋ธŒํด๋ž˜์Šค์—์„œ estimate_size ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” ํŒŒ์ดํ”„๋ผ์ธ์— ์‚ฌ์šฉํ•  ์ดˆ๊ธฐ ์ž‘์—…์ž ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ estimate_size์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RangeTracker ์„œ๋ธŒํด๋ž˜์Šค์—์„œ fraction_consumed ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” fraction_consumed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ณ  ์ฝ๋Š” ์ค‘์— ์‚ฌ์šฉํ•  ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์ˆ˜๋ ดํ•ฉ๋‹ˆ๋‹ค.

Go

์ œํ•œ๋œ ์†Œ์Šค

  • RangeTracker์—์„œ GetProgress() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Dataflow ์„œ๋น„์Šค๋Š” GetProgress์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ณ  ์ฝ๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์ž ์ˆ˜๋ฅผ ์ˆ˜๋ ดํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • Dataflow Prime์„ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์—์„œ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์€ ์ˆ˜์ง ์ž๋™ ํ™•์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ดํ›„ ์ตœ๋Œ€ 10๋ถ„ ๋™์•ˆ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • Dataflow Shuffle์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ์ž‘์—…์ž๊ฐ€ ๋กœ์ปฌ ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์…”ํ”Œํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Dataflow๊ฐ€ ์ž‘์—…์ž๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ถ•์†Œํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • PeriodicImpulse ๋ณ€ํ™˜์€ Apache Beam SDK ๋ฒ„์ „ 2.60.0 ์ด์ƒ์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ž๋™ ํ™•์žฅ๊ณผ ํ•จ๊ป˜ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ด์ „ SDK ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ PeriodicImpulse๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Dataflow ์ž‘์—…์ž๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ถ•์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„