Spark streaming 02 - asloud/dev_note01 GitHub Wiki

์ถœ๋ ฅ ์—ฐ์‚ฐ

  • ์ถœ๋ ฅ ์—ฐ์‚ฐ์€ ์ŠคํŠธ๋ฆผ์—์„œ ์ตœ์ข… ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์˜ ๊ฒฐ๊ณผ์—์„œ ๋ฌด์—‡์ด ํ•„์š”ํ•œ๊ฐ€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • DStream์˜ ์ถœ๋ ฅ ์—ฐ์‚ฐ์ด ์—†๋‹ค๋ฉด ์‹ค์ œ๋กœ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. (transformation์ด ๋™์ž‘ํ•˜์ง€๋„ ์•Š์Œ), StreamingContext์— ์ถœ๋ ฅ ์—ฐ์‚ฐ์ด ์—†๋‹ค๋ฉด ์‹œ์ž‘๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • print() : ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋””๋ฒ„๊น… ์ถœ๋ ฅ ์—ฐ์‚ฐ
    • DStream์˜ ๊ฐ ๋ฐฐ์น˜๋งˆ๋‹ค ์ฒซ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ.
  • save() ์—ฐ์‚ฐ๋“ค๋„ ์žˆ์Œ. ํŒŒ์ผ์„ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ์™€ ์ถ”๊ฐ€์ ์ธ ์ ‘๋ฏธ์–ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค.
  • saveAsHadoopFiles() : ํ•˜๋‘ก์˜ OutputFormat ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค.
  • foreachRDD() :
    • DStream์ด RDD๋“ค์— ์ž„์˜์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๋ฒ”์šฉ์ ์ธ ์ถœ๋ ฅ ์—ฐ์‚ฐ.
    • foreachRDD() ์•ˆ์—์„œ๋Š” ์ŠคํŒŒํฌ์—์„œ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์•ก์…˜์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ์†Œ์Šค

  • ์ผ๋ถ€ ํ•ต์‹ฌ ์†Œ์Šค๋“ค์€ spark streaming ์•„ํ‹ฐํŒฉํŠธ ์•ˆ์— ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ์ถ”๊ฐ€์ ์ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ maven pom.xml์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
  • ํ•ต์‹ฌ์†Œ์Šค
    • ํ•ต์‹ฌ ์†Œ์Šค๋“ค๋กœ๋ถ€ํ„ฐ DStream์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์€ ๋ชจ๋‘ StreamingContext์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํŒŒ์ผ, ์†Œ์ผ“, Akka actor
    • ํŒŒ์ผ
      • ์ŠคํŒŒํฌ๋Š” ๋ชจ๋“  ํ•˜๋‘ก ํ˜ธํ™˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ spark streaming์€ ํ•˜๋‘ก ํ˜ธํ™˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ง€์›.
      • ํŒŒ์ผ์€ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค (ํฌ๋งท ํฌํ•จ)
  • ๊ทธ์™ธ ์ž…๋ ฅ ์†Œ์Šค
    • ํ˜„์žฌ ์—ฌ๋Ÿฌ ๋ฆฌ์‹œ๋ฒ„๋ฅผ ์ง€์›
    • ํŠธ์œ„ํ„ฐ(Twitter), ์•„ํŒŒ์น˜ ์นดํ”„์นด(Apache kafka), ์•„๋งˆ์กด ํ‚ค๋„ค์‹œ์Šค(Amazon Kinesis), ์•„ํŒŒ์น˜ ํ”Œ๋Ÿผ(Apache Flume), ์ œ๋กœMQ(ZeroMQ) ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.
    • ์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋น„์„œ๋“ค์€ ๋ฉ”์ด๋ธ ์•„ํ‹ฐํŒฉํŠธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Apache Kafka
    • ์•„ํŒŒ์น˜ ์นดํ”„์นด๋Š” ์†๋„์™€ ์œ ์—ฐํ•จ ๋•Œ๋ฌธ์— ์ธ๊ธฐ์žˆ๋Š” ์ž…๋ ฅ์†Œ์Šค.
    • ์นดํ”„์นด์— ๋‚ด์žฅ ์ง€์› ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋งŽ์€ ํ† ํ”ฝ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์นดํ”„์นด ์ŠคํŠธ๋ฆผ, ์นดํ”„์นด ๋‹ค์ด๋ ‰ํŠธ ์ŠคํŠธ๋ฆผ ์ œ๊ณต
    • KafkaUtils ๊ฐ์ฒด
      • StreamingContext, JavaStreamingContext์—์„œ ๋™์ž‘ํ•˜๋ฉฐ ์นดํ”„์นด ๋ฉ”์ง€์˜ DStream์„ ์ƒ์„ฑํ•œ๋‹ค.
      • KafkaUtils์˜ createStream ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
    • ์นดํ”„์นด ์ŠคํŠธ๋ฆผ
      • ์นดํ”„์นด์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ์‹ (๋ง์ด ์ˆ˜์‹ , ์ผ์ข…์˜ polling)
      • (Java)StreamingContext, ์ฃผํ‚คํผ ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก, ๋ฉ”์‹œ์ง€ consumer ๊ทธ๋ฃน ์ด๋ฆ„, ํ† ํ”ฝ ๋ชฉ๋ก, ๋ฆฌ์‹œ๋ฒ„ ์Šค๋ ˆ๋“œ ์ˆ˜ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ
    • ์นดํ”„์นด ๋‹ค์ด๋ ‰ํŠธ ์ŠคํŠธ๋ฆผ (3DVS์—์„œ ์ด ๋ฐฉ์‹ ์‚ฌ์šฉ)
      • ์นดํ”„์นด์—์„œ ์ง์ ‘(Direct) ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๋Š” ๋ฐฉ์‹
      • ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ๋‹ค์Œ ๋ณต์ œํ•  ํ•„์š” ์—†๊ณ , ์‹คํŒจํ•˜๋ฉด ๊ทธ๋งŒ
      • ์ŠคํŠธ๋ฆผ์„ ์—ฐ๊ฒฐํ•  ํ•„์š” ์—†์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ๋”๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
      • ์ฃผํ‚คํผ ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก์„ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์นดํ”„์นด ๋ธŒ๋กœ์ปค ๋ชฉ๋ก์„ ์ง์ ‘ ๋„ฃ์–ด์ค€๋‹ค.
      • ์‚ฌ์šฉํ•  ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค

์—ฌ๋Ÿฌ ์ž…๋ ฅ์†Œ์Šค ์‚ฌ์šฉ, ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์ด์ง•

  • union() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DStream์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ์—ฐ์‚ฐ์œผ๋กœ ์ž…๋ ฅ DStream์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ์‹œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•˜๋‹ค. / ์„œ๋ฒ„ ๋‹ค๋ฅธ ์†Œ์Šค๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์น˜๊ธฐ๋„ ํ•œ๋‹ค.
  • ๊ฐ ๋ฆฌ์‹œ๋ฒ„๋Š” ์ŠคํŒŒํฌ์˜ ์ต์Šคํํ„ฐ ๋‚ด์—์„œ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ๋˜์–ด ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฆฌ์‹œ๋ฒ„๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ• ๋‹น๋œ CPU ์ฝ”์–ด๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ฝ”์–ด๋„ ํ•„์š”ํ•˜๋‹ค.
    • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฆฌ์‹œ๋ฒ„๋ฅผ ์œค์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ๋ฆฌ์‹œ๋ฒ„ ๊ฐœ์ˆ˜๋งŒํผ์˜ ์ฝ”์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ถ”๊ฐ€๋กœ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ฝ”์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

24/7 ์šด์˜ (๋ฌด์ค‘๋‹จ ์šด์˜)

  • Spark streaming์˜ ์ฃผ๋œ ์žฅ์ ์€ ๊ฐ•๋ ฅํ•œ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋Šฅ๋ ฅ์ด๋‹ค.
  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ•œ Spark streaming์€ ์–ธ์ œ๋‚˜ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ฌ์ง€์–ด ๋“œ๋ผ์ด๋ฒ„๋‚˜ ์ž‘์—… ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ์ƒ๊ฒจ๋„ "๋”ฑ ํ•œ๋ฒˆ ๋งŒ์—" ์ฝ˜์…‰ํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • 24/7๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ํŠน์ˆ˜ํ•œ ์„ค์ • ํ•„์š”
    • ์•ˆ์ •์ ์ธ ์ €์žฅ ์‹œ์Šคํ…œ์— checkpointing ์„ค์ •, ๋“œ๋Ÿฌ์ด๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์˜ ์žฅ์•  ๋Œ€์‘์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ๋ ค, ์•ˆ์ •์ ์ด์ง€ ์•Š์€ ์ž…๋ ฅ ์†Œ์Šค์— ๋Œ€ํ•œ ๊ณ ๋ ค๋„ ํ•„์š”
  • Checkpointing
    • ์ฒดํฌํฌ์ธํŒ…์€ ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์—์„œ ์žฅ์•  ๋Œ€์‘์„ ์œ„ํ•ด ๊ตฌ์ถ•ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ํ•ต์‹ฌ ๋งค์ปค๋‹ˆ์ฆ˜.
    • ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ์•ˆ์ •์ ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค
    • ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต
      • ์žฅ์•  ์‹œ ์žฌ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์ œํ•œํ•œ๋‹ค. ์ฒดํฌํฌ์ธํŒ…์€ ์ƒํƒœ๋ฅผ ์žฌ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ์„ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๋˜๋Œ๋ฆด์ง€๋ฅผ ์ œ์–ดํ•œ๋‹ค.
      • ๋“œ๋ผ์ด๋ฒ„์— ๋Œ€ํ•ด ์žฅ์•  ๋Œ€์‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์—ˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ์žฌ์‹คํ–‰์‹œํ‚ค๊ณ  ๋ณต๊ตฌํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์ด์ „์— ์‹คํ–‰๋œ ์ฒดํฌํฌ์ธํŠธ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ณต๊ตฌํ•  ๊ฒƒ์ด๋‹ค.
  • ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋“œ๋ผ์ด๋ฒ„ ์žฅ์• ๋Œ€์‘
    • ๋“œ๋ผ์ด๋ฒ„ ๋…ธ๋“œ์˜ ์žฅ์• ์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์€ StreamingContext ์ƒ์„ฑ ์‹œ ์ฒดํฌํฌ์ธํŒ… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฐ›์•„๋“ค์ด๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ• ํ•„์š”
    • new StreamingContext() ํ˜ธ์ถœ ๋Œ€์‹ , StreamingContext.getOrCreate() ํ•จ์ˆ˜ ์‚ฌ์šฉ
      • ์ฒดํฌํฌ์ธํŠธ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด StreamingContext ์ƒ์„ฑ, ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์žฅ์• ๊ฐ€ ๋‚˜์„œ ์žฌ์‹œ์ž‘ ํ›„ ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ฒดํฌํฌ์ธํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ StreamingContext๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์† ์ง„ํ–‰
    • ๋“œ๋ผ์ด๋ฒ„ ์žฌ์‹คํ–‰
      • ๋“œ๋ผ์ด๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์œผ๋ฉด ์ž๋™์œผ๋กœ ์žฌ์‹คํ–‰ํ•˜๋Š”๊ฒƒ์ด ํ•„์š”
      • ๋‹จ๋… ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €์˜ ๊ฒฝ์šฐ, ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ์ถœํ•  ๋•Œ --supervise ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŒŒํฌ๊ฐ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • --deploy-mode cluster ์ง€์ •ํ•˜์—ฌ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋กœ์ปฌ ๋จธ์‹ ์ด ์•„๋‹Œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•ด์ค„ ํ•„์š”๋„ ์žˆ๋‹ค.
    • ์žฌ์‹คํ–‰๋œ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋ฉˆ์ถ˜ ์ง€์ ๋ถ€ํ„ฐ ๋™์ž‘ํ•˜๋„๋ก ์ƒˆ๋กœ์šด ์ต์Šคํํ„ฐ๋ฅผ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค.
  • ์ž‘์—… ๋…ธ๋“œ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ
    • ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ž‘์—… ๋…ธ๋“œ ์žฅ์•  ๋Œ€์‘์€ ์ŠคํŒŒํฌ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹น์ž‘.
    • ์™ธ๋ถ€ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ŠคํŒŒํฌ ์ž์—… ๋…ธ๋“œ ๊ฐ„์— ๋ณต์ œ๋œ๋‹ค. ์ด ๋ณต์ œ๋œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋“  RDD ๊ฐ€๊ณ„๋„๋ฅผ ํ†ตํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์‚ด์•„์žˆ๋Š” ๋ณต์ œ๋ณธ์œผ๋กœ๋ถ€ํ„ฐ ์œ ์‹ค๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ์Šคํ…œ์ด ์žฌ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์žฅ์• ์— ๋Œ€ํ•ด ๋‚ด์„ฑ์ด ๋†’๋‹ค.
  • ๋ฆฌ์‹œ๋ฒ„ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ
    • ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ๋™์ž‘ ์ค‘์ธ ์ž‘์—… ๋…ธ๋“œ์˜ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ์€ ์ค‘์š”ํ•œ ์ด์Šˆ
    • ์žฅ์• ์—์„œ ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์‹คํŒจํ•œ ๋ฆฌ์‹œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€๋Š” ์ž…๋ ฅ ์†Œ์Šค์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๋ฆฌ์‹œ๋ฒ„์˜ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
    • ๋ฆฌ์‹œ๋ฒ„๋“ค์—์„œ ๋ณดํ†ต ๋ณด์žฅํ•˜๋Š” ๊ฒƒ๋“ค
    • ์•ˆ์ •์ ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ(์˜ˆ, HDFS)์—์„œ ์ฝ์–ด ์˜จ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋ณต์ œ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์•ˆ์ •์ ์ด๋‹ค. ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์ฒดํฌํฌ์ธํŠธ๋กœ ์–ด๋А ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ฒ˜๋ฆฌ๋„์—ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋ฅด๋ฉด ๋๋‚œ ์ดํ›„๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ.
    • ๋ฆฌ์‹œ๋ฒ„ ๊ธฐ๋ฐ˜์˜ ๊ฐ€ํฌ์นด๋‚˜ ํ‘ธ์‹œ ๊ธฐ๋ฐ˜์˜ ํ”Œ๋Ÿผ ๋“ฑ์€ ์•ˆ์ •์ ์ด๋‹ˆ ์•Š์€ ์†Œ์Šค์— ๋Œ€ํ•ด์„œ๋Š” ์ŠคํŒŒํฌ์—์„œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜์ง€๋งŒ, ๋ฆฌ์‹œ๋ฒ„ ํƒœ์Šคํฌ๊ฐ€ ์ผ์‹œ ๋‹ค์šด๋˜๋ฉด ๋ฐ์ดํ„ฐ ์œ ์‹ค ์œ„ํ—˜์ด ์žˆ๋‹ค.
    • ์ŠคํŒŒํฌ 1.2๋ถ€ํ„ฐ HDFS์™€ ๊ฐ™์€ ์•ˆ์ •์ ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋กœ๊น…์ด ๊ฐ€๋Šฅํ•ด์ ธ ๋“œ๋ผ์ด๋ฒ„ ์žฌ์‹œ์ž‘์˜ ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ ์œ ์‹ค ์œ„ํ—˜์€ ์—†์–ด์กŒ๋‹ค.
    • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•ˆ์ •์ ์ธ ์ž…๋ ฅ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ์•ˆ์ •์ ์ด์ง€ ์•Š์€ ์ž…๋ ฅ ์†Œ์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋ฐ์ดํ„ฐ ์œ ์‹ค์„ ํ”ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
      • spark.streaming.receiver.writeAheadLog.enable์„ true๋กœ ์„ค์ •ํ•˜์—ฌ WAS(Write-Ahead Logging)์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ž‘์—… ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ณด์žฅ
    • ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ž‘์—… ๋…ธ๋“œ ์žฅ์•  ๋‚ด๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ณด์žฅ ๋•ํƒ์— ๋ชฏใ„ด ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์— ๋Œ€ํ•ด "๋”ฑ ํ•œ๋ฒˆ ์ฒ˜๋ฆฌ(exactly once)" ์ปจ์…‰ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ถœ๋ ฅ ์—ฐ์‚ฐ์„ ํ†ตํ•˜์—ฌ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋ณด๋‚ด์งˆ ๋•Œ๋Š” ํƒœ์Šคํฌ์˜ ์˜ค๋ฅ˜๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
      • ํŠธ๋žœ์žญ์…˜, ๋ฉฑ๋“ฑ์—ฐ์‚ฐ ๋“ฑ์˜ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค -> ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ž˜ ๋งŒ๋“ค์–ด๋ผ...

์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ช‡ ๊ฐ€์ง€ ํŠนํ™”๋œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์˜ต์…˜์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ๋ฐฐ์น˜/์œˆ๋„ ํฌ๊ธฐ
    • ์–ด๋А ์ •๋„์˜ ์ตœ์†Œ ๋ฐฐ์น˜๊ฐ€ ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์ ๋‹นํ•œ๊ฐ€??? ==> 500ms๊ฐ€ ์ตœ์ ์˜ ์ตœ์†Œ ํฌ๊ธฐ๋กœ ํŒ๋ช…
    • ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํฐ ๋ฐฐ์น˜ ํฌ๊ธฐ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ž‘์€ ์‚ฌ์ด์ฆˆ๋กœ ๋‚ฎ์ถฐ ๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํ•˜์—ฌ ํ™•์ธ
    • ์œˆ๋„ ์—ฐ์‚ฐ๋„ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ„๊ฒฉ์ด ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ‘๋ ฌํ™” ์ˆ˜์ค€
    • ๋ฐฐ์น˜์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ณ‘๋ ฌํ™” ์ˆ˜์ค€์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ. ๋ณ‘๋ ฌํ™” ์ˆ˜์ค€์„ ์˜ฌ๋ฆฌ๋Š” ๋ฐ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
    • ๋ฆฌ์‹œ๋ฒ„ ๊ฐœ์ˆ˜ ๋Š˜๋ฆฌ๊ธฐ
      • ๋ฆฌ์‹œ๋ฒ„๋Š” ํ•˜๋‚˜์˜ ๋จธ์‹ ์œผ๋กœ ๋„ˆ๋ฌด ๋งŽ์€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋ถ„๋ฐฐํ•œ๋‹ค๋ฉด ๋ณ‘๋ชฉํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž…๋ ฅ DStream์„ ๋งŒ๋“ค์–ด ๋ฆฌ์‹œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , union์„ ์ ์šฉํ•˜์—ฌ ํ•ฉ์ณ์„œ ๋‹จ์ผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.
    • ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹์ ์œผ๋กœ ์žฌํŒŒํ‹ฐ์…”๋‹
      • ๋ฆฌ์‹œ๋ฒ„๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ํž˜๋“ค๋‹ค๋ฉด DStream.repartition์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์žฌํŒŒํ‹ฐ์…”๋‹ํ•˜์—ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•œ๋‹ค.
    • ์ง‘ํ•ฉ ์—ฐ์‚ฐ ์‹œ ๋ณ‘๋ ฌํ™” ๊ฐœ์ˆ˜ ๋Š˜๋ฆฌ๊ธฐ
      • reduceByKey() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์š”ํ•  ๋•Œ ๋ณ‘๋ ฌํ™” ์ •๋„ ์ง€์ •.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ Œ์…˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
    • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ด์Šˆ/๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ถ€๋ถ„์€ Java์˜ GC ๋ถ€๋ถ„.
    • ์ž๋ฐ”์˜ ๋ณ‘๋ ฌ ๋งˆํฌ ์Šค์œ•(Concurrent-Mark-Sweep) ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก๋˜์ง€ ์•Š์€ GC์— ์˜ํ•œ ์ผ์‹œ ์ •์ง€๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋ณ‘๋ ฌ ๋งˆํฌ ์Šค์œ• ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ „์ฒด์ ์œผ๋กœ ์ž์›์„ ์ข€ ๋” ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ผ์‹œ์ •์ง€ ์ƒํƒœ๋ฅผ ์ค„์—ฌ์ค€๋‹ค.
    • GC๋Š” spark.executor.extraJavaOptions์˜ ์„ค์ • ์†์— -XX:+UseConcMarkSweepGC๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
      • spark-submit --conf spark.executor.extraJavaOptions=-XX:+UseConcMarkSweepGC App.jar
    • GC์˜ ๋ถ€๋‹ด์„ ์ค„์—ฌ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ๋‹ค.
      • ์ง๋ ฌํ™” ํ˜•ํƒœ๋กœ RDD๋ฅผ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ GC ๋ถ€ํƒ์„ ์ค„์—ฌ์ค€๋‹ค. => ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์˜ํ•ด ์ƒ์„ฑ๋œ RDD๋Š” ์ง๋ ฌํ™” ์„ฑํƒœ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ.
      • ์นด์ด๋กœ(Kyro) ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ใ„ด๊ฒƒ์ด ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”์šฑ ์ค„์—ฌ์ค€๋‹ค.
    • ์ŠคํŒŒํฌ๋Š” ์บ์‹œ ๋˜๋Š” ์˜์†ํ™”๋œ RDD๊ฐ€ ์บ์‹œ๋กœ๋ถ€ํ„ฐ ์‚ญ์ œ๋ ์ง€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ• ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
      • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ŠคํŒŒํฌ๋Š” LRU ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ spark.cleaner.ttl์„ ์„ค์ •ํ•œ๋‹ค๋ฉด ์ŠคํŒŒํฌ๋Š” ํŠน์ • ์‹œ๊ฐ„์ด ์ž๋‚œ RDD๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
      • ์บ์‹œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ RDD๋ฅผ ๋ฏธ๋ฆฌ ์‚ญ์ œํ•จ์œผ๋กœ์จ GC์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.