Spark streaming 01 - asloud/dev_note01 GitHub Wiki

Spark streaming ๊ฐœ๋…, ๊ธฐ๋ณธ

  • Spark streaming์€ ์‚ฌ์šฉ์ž๋“ค์ด ๋ฐฐ์น˜ ์ž‘์—…์— ์ผ๋˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ API๋ฅผ ํ†ตํ•ด ์ŠคํŠธ๋ฆฌ๋ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ๊ธฐ์กด์— ์ผ๋˜ ๊ธฐ์ˆ ๊ณผ ์ฝ”๋“œ๋ฅผ ์žฌํ™œ์šฉํ•˜๋ผ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
  • Spark streaming์€ DStream(Discretized stream, ์ด์‚ฐ ์ŠคํŠธ๋ฆผ)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ถ”์ƒํ™” ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๋‹ค.
    • DStream์€ ์‹œ๊ฐ„๋ณ„๋กœ ๋„์ฐฉํ•œ ๋ฐ์ดํ„ฐ๋“ค์˜ ์—ฐ์†์ ์ธ ๋ชจ์Œ
    • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ฐ๊ฐ์˜ DStream์€ ๊ฐ ์‹œ๊ฐ„๋ณ„๋กœ ๋„์ฐฉํ•œ RDD๋“ค์˜ ์—ฐ์†์ ์ธ ๋ชจ์Œ์œผ๋กœ ๊ตฌ์„ฑ
    • DStream์€ HDFS, Kafka ๋“ฑ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ์†Œ์Šค๋กœ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • DStream์€ ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์˜ ์—ฐ์‚ฐ ์ œ๊ณต
    • ์ƒˆ๋กœ์šด DStream์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” transformation
    • ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์จ์ฃผ๋Š” ๊ฒฐ๊ณผ ์—ฐ์‚ฐ (output operation)
  • DStream์€ RDD์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ๋งŽ์€ ์—ฐ์‚ฐ ์ง€์›, ์‹œ๊ฐ„ ๊ด€๋ จ์ด๋‚˜ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ๋„ ์ง€์›

Spark streaming ์ฝ”๋”ฉ/๊ตฌ์„ฑ

  • Spark streaming์€ Maven์ด๋‚˜ sbt๋กœ ๋นŒ๋“œ๋œ ๋‹จ์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ๊ฐ€์žฅ ์ž˜ ๋Œ์•„๊ฐ„๋‹ค.
  • ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ฃผ ์‹œ์ž‘์ ์€ StreamingContext๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘.
    • Java์˜ ๊ฒฝ์šฐ JavaStreamingContext ์ƒ์„ฑ
  • Batch interval : ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค์ •์ธ ๋ฐฐ์น˜ ๊ฐ„๊ฒฉ๋„ ์„ค์ •
  • ์‹œ์ž‘, ์ข…๋ฃŒ
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ StreamingContext์˜ start() ํ˜ธ์ถœ
      • Spark streaming์€ ๋‚ด๋ถ€์˜ SparkContext์— ์ŠคํŒŒํฌ ์ž‘์—…๋“ค์„ ์Šค์ผ€์ค„๋ง ์‹œ์ž‘.
    • ์ด๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์ž‘์—…์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด awaitTermination์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • StreamingContext๋Š” ํ•œ ๋ฒˆ๋งŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ DStream๊ณผ ๊ด€๋ จ๋œ ์ถœ๋ ฅ ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ž‘์—…ํ•œ ํ›„์— ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค!

์•„ํ‚คํ…์ฒ˜์™€ ์ถ”์ƒํ™” ๊ฐœ๋…

  • Spark streaming์€ "๋งˆ์ดํฌ๋กœ ๋ฐฐ์น˜ micro batch"๋ผ ๋ถˆ๋ฆฌ๋Š” ์ดํ‚คํ…์ฒ˜ ์‚ฌ์šฉ
    • micro barch : ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ์˜ ์ž‘์€ ๋‹จ์œ„๋“ค ์œ„์—์„œ ๊ฐ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์˜ ์—ฐ์†์ €์ธ ํ๋ฆ„์œผ๋กœ ๊ฐ„์ฃผ
    • Spark streaming์€ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์—ฌ ์ด๊ฒƒ๋“ค์„ ์ž‘์–ธ ๊ทธ๋ฃน๋“ค๋กœ ๋ฌถ๋Š”๋‹ค
  • Batch ์ƒ์„ฑ ๋‹จ๊ณ„
    • ์ƒˆ๋กœ์šด ๋ฐฐ์น˜๋“ค์€ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ๋งˆ๋‹ค ๋งŒ๋“ค์–ด์ง„๋‹ค.
    • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ๋™์•ˆ ๋ฐ›์•„๋“ค์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฐ์น˜์— ๊ณ„์† ์ถ”๊ฐ€
    • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์˜ ๋งˆ์ง€๋ง‰์—๋Š” ๋ฐฐ์น˜ ์ถ”๊ฐ€๋ฅผ ์™„๋ฃŒ
  • Batch interval(์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์˜ ๊ธธ์ด)์€ ์„ค์ •์— ๋”ฐ๋ผ ๊ฒฝ์ •
    • 500ms๋ถ€ํ„ฐ ์ˆ˜ ์ดˆ ์‚ฌ์ด, ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ๊ฒฐ์ •
  • ๊ฐ ์ž…๋ ฅ ๋ฐฐ์น˜๋ฅผ RDD ํ˜•ํƒœ์ด๋ฉฐ ์ŠคํŒŒํฌ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ RDD๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ฒ˜๋ฆฌ.
  • ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋‰˜์–ด ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋ณด๋‚ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
  • Spark streaming์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์ธ ์ถ”์ƒํ™” ๊ฐœ๋…
    • DStream์ด๋ผ ๋ถˆ๋ฆฌ๋Š” RDD์˜ ์—ฐ์†์ ์ธ ๋ฌถ์Œ
    • ๊ฐ RDD๋Š” ํ๋ฆ„ ์•ˆ์—์„œ 1ํšŒ์šฉ์œผ๋กœ ์“ฐ์ผ ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์„ ๊ฐ–๋Š”๋‹ค.
  • DStream์€ ์™ธ๋ถ€ ์ž…๋ ฅ์†Œ์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๊ฑฐ๋‚˜, ๋‹ค๋ฅธ DStream์— ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • DStream์€ ์ถœ๋ ฅ ์—ฐ์‚ฐ๋„ ์ง€์›
    • ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์“ด๋‹ค๋Š” ์ ์€ RDD์˜ ์•ก์…˜๊ณผ ์œ ์‚ฌ, Spark streaming์—์„œ ์ด๋Š” ๋งค์‹œ๊ฐ„ ๋‹จ๊ณ„๋งˆ๋‹ค ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์ถœ๋ ฅ์€ batch ๋‹จ์œ„๋กœ ์ƒ์„ฑ
  • Spark streaming์˜ ๊ฐ ์ž…๋ ฅ ์†Œ์Šค๋งˆ๋‹ค receiver๋ฅผ ์‹คํ–‰
    • ์ด๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ต์Šคํํ„ฐ๋“ค ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋“œ๊ณ  RDD์— ์ €์žฅํ•˜๋Š” ํ…Œ์Šคํฌ๋“ค. ์ด๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์žฅ์• ๋Œ€์‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์ต์Šคํํ„ฐ์— ๋ณต์‚ฌ.
    • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๋ณต์ œ๋ณธ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ, RDD๋“ค์˜ ๊ฐ€๊ณ„๋„๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ด๋–ค ์ƒํƒœ์—์„œ๋ผ๋„ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Spark streaming์€ ์ฒดํฌํฌ์ธํŒ… checkpointing ์ด๋ผ๋Š” ๊ฒฌ๊ณ ํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ๋”ฐ๋กœ ๊ฐ–๊ณ  ์žˆ๋‹ค. (์žฅ์• ๋Œ€์‘์„ ์œ„ํ•˜์—ฌ)

Transformation

  • DStream์˜ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์€ ๋ฌด์ƒํƒœ stateless์™€ ์ƒํƒœ ์œ ์ง€ stateful๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌด์ƒํƒœ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜
    • ๊ฐ ๋ฐฐ์น˜์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•ž์ชฝ์˜ ๋ฐฐ์น˜๋“ค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ์ƒ๊ด€์—†์ด ์ง„ํ–‰
    • ์ผ๋ฐ˜์ ์ธ RDD์ด ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜๋“ค์ด ํฌํ•จ
  • ์ƒํƒœ ์œ ์ง€ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜
    • ํ˜„์žฌ ๋ฐฐ์น˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด์ „ ๋ฐฐ์น˜์˜ ๋ฐ์ดํ„ฐ๋‚˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉ
    • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์™€ ์‹œ๊ฐ„๋ณ„ ์ƒํƒœ ์ถ”์ ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๋Š” ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜๋“ค์ด ํฌํ•จ
  • ๋ฌด์ƒํƒœ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜ ์—ฐ์‚ฐ
    • ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค. RDD ์—ฐ์‚ฐ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค.
  • ์ƒํƒœ ์œ ์ง€ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜ ์—ฐ์‚ฐ
    • ์‹œ๊ฐ„ ๋‹จ๊ณ„ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•˜๋Š” DStream์˜ ์—ฐ์‚ฐ.
    • ์ด์ „ ๋ฐฐ์น˜๋“ค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐฐ์น˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.
    • ๋‘ ๊ฐ€์ง€ ํƒ€์ž… : ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์—์„œ ๋™์ž‘ํ•˜๋Š” ์œˆ๋„ ์—ฐ์‚ฐ / ๊ฐ ํ‚ค์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋“ค ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” updateStateByKey()
  • ์ƒํƒœ์œ ์ง€ ํ”„๋žœ์Šคํฌ๋ฉ”์ด์…˜์€ ์žฅ์•  ๋Œ€์‘์„ ํœ˜์•  StreamingContext์—์„œ ์ฒดํ‚คํฌ์ธํŒ…์„ ํ™œ์„ฑํ™”๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค
  • Window transformation
    • ์—ฌ๋Ÿฌ ๋ฐฐ์น˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ StreamingContext์˜ ๋ฐฐ์น˜ ๊ฐ„๊ฒฉ๋ณด๋‹ค ํ›จ์”ฌ ๊ธด ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ๋ชจ๋“  ์œˆ๋„ ์—ฐ์‚ฐ์„ ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
      • ์œˆ๋„ ์‹œ๊ฐ„(window duration), ์Šฌ๋ผ์ด๋”ฉ ์‹œ๊ฐ„(sliding duration)
      • ์ด ๋‘๊ฐ€์ง€ ๊ฐ’์€ ๋ชจ๋‘ StreamingContext์˜ ๋ฐฐ์น˜ ๊ฐ„๊ฒฉ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.
    • window duration : ์ง€๋‚˜๊ฐ„ ๋ฐฐ์น˜๋ฅผ ๋ช‡ ๊ฐœ๋‚˜ ์‚ฌ์šฉํ• ์ง€ ์ œ์–ด (์œˆ๋„ ์‹œ๊ฐ„/๋ฐฐ์น˜๊ฐ„๊ฒฉ), ๊ฐœ์ˆ˜๋งŒํผ์˜ ์ตœ๊ทผ ๋ฐฐ์น˜๋“ค์„ ์‚ฌ์šฉ.
    • sliding duration : ๊ธฐ๋ณธ๊ฐ’์€ ๋ฐฐ์น˜ ๊ฐ„๊ฒฉ๊ณผ ๋™์ผ, ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ƒˆ๋กœ์šด DStream์ด ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ• ์ง€ ๊ฒฐ์ •
    • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์œˆ๋„ ์—ฐ์‚ฐ์€ window(), ์š”์ฒญ๋œ ์œˆ๋„ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋กœ ์ƒˆ DStream์„ ๋งŒ๋“ค์–ด ๋˜๋Œ๋ ค ์ค€๋‹ค.
  • updateStateByKey transformation
    • DStream ์•ˆ์—์„œ ๋ฐฐ์น˜๋“ค์„ ํ†ตํ‹€์–ด์„œ ์œ ์ง€๋˜๋Š” ์ƒํƒœ ์กด์žฌ
    • updateStateByKey() ํ‚ค/๊ฐ’ ์Œ์˜ DStream์„ ์œ„ํ•œ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณต
    • (ํ‚ค, ์ด๋ฒคํŠธ) ์Œ์ด DStream์— ์ฃผ์–ด์ง€๋ฉด, ์ด๋Š” ์ƒˆ ์ด๋ฒคํŠธ์— ์ฃผ์–ด์ง„ ๊ฐ ํ‚ค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์ •์˜๋œ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์—ฌ ์ƒˆ (ํ‚ค, ์ƒํƒœ) ์Œ์˜ DStream์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • updateStateByKey()๋ฅผ ์“ฐ๋ ค๋ฉด ํ‚ค์— ๋Œ€ํ•ด, ๋„์ฐฉํ•œ ์ด๋ฒคํŠธ์™€ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” update(events, oldState) ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ newState๋ฅผ ๋˜๋Œ๋ ค์ค€๋‹ค.
      • events๋Š” ํ˜„์žฌ ๋ฐฐ์น˜์— ๋„์ฐฉํ•œ ์ด๋ฒคํŠธ์˜ ๋ชฉ๋ก์ด๋‹ค (์—†์„ ์ˆ˜ ์žˆ์Œ).
      • oldState๋Š” ์„ ํƒ์ €์œผ๋กœ ์กด์žฌํ•˜๋Š” ์ƒํƒœ ๊ฐ์ฒด์ด๋ฉฐ Option์— ์ €์žฅ๋œ๋‹ค. ๋งŒ์•ฝ ํ‚ค์— ๋Œ€ํ•ด ์ด์ „ ์ƒํƒœ๊ฐ€ ์—†์œผ๋ฉด ์—†์„ ์ˆ˜ ์žˆ๋‹ค.
      • newState๋Š” ํ•จ์ˆ˜์— ์˜ํ•ด ๋˜๋Œ๋ ค์ฃผ๊ฒŒ ๋˜๋ฉฐ, ๋˜ํ•œ Option์ด๋‹ค. ์ƒํƒœ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์—†๋Š” ์ฑ„๋กœ ๋˜๋Œ๋ ค ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด ๋นˆ Option์„ ๋˜๋Œ๋ ค์ค€๋‹ค.
    • updateStateByKey()์˜ ๊ฒฐ๊ณผ๋Š” ๋งค์‹œ๊ฐ„ ๋‹จ๊ณ„๋งˆ๋‹ค์˜ (ํ‚ค, ์ƒํƒœ) ์Œ๋“ค์˜ RDD๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด DStream์ด ๋œ๋‹ค.