spark_base

Spark

์ŠคํŒŒํฌ ์›Œํฌ๋กœ๋“œ

  • image

    • https://aws.amazon.com/ko/big-data/what-is-spark/

  • ์ŠคํŒŒํฌ๋Š” ํ•˜๋‘ก ๋งต๋ฆฌ๋“€์Šค๋ณด๋‹ค ์ตœ๋Œ€ 100๋ฐฐ ๋” ๋น ๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ŠคํŒŒํฌ๋Š” ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ๋Œ€์‹ ์— ์ธ ๋ฉ”๋ชจ๋ฆฌ(In-Memory)๋กœ ๋™์ž‘ํ•˜๊ณ , ๋งต๋ฆฌ๋“€์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์‹œ ๊ฒฐ๊ณผ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๋ฐ˜๋ฉด์— ์ŠคํŒŒํฌ๋Š” ์ด ๊ณผ์ •์„ ํ•œ ๊ณณ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.(2016๋…„ 100ํ…Œ๋ผ๋ฐ”์ดํŠธ ์ •๋ ฌ์— 512๊ฐœ์˜ ๋…ธ๋“œ๋กœ 98.8์ดˆ ๋งŒ์— ์™„๋ฃŒ)

  • MapReduce๋Š” ๋ฐ์ดํ„ฐ์˜ ์ค‘๊ฐ„๊ณผ์ •์„ HDFS์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.Spark์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ In-Memory ์ฒ˜๋ฆฌ๋กœ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ์ƒ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์—ฐ์‚ฐ ํ•ด์•ผํ•˜๋Š” ๋‹จ์ ์ด ์ƒ๊น๋‹ˆ๋‹ค.

  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์†์œผ๋กœ ๋ณ‘๋ ฌ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ์—”์ง„์ž…๋‹ˆ๋‹ค.

  • ์Šคํ† ๋ฆฌ์ง€ I/O์™€ ๋„คํŠธ์›Œํฌ I/O๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉฐ, ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ๋‚˜ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ž‘์€ ์ž‘์—…์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • SQL๊ณผ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ŠคํŒŒํฌ SQL, ๋จธ์‹ ๋Ÿฌ๋‹์„ ์ง€์›ํ•˜๋Š” MLlib, ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ŠคํŒŒํฌ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ์ƒˆ๋กญ๊ฒŒ ์„ ๋ณด์ธ ๊ตฌ์กฐ์  ์ŠคํŠธ๋ฆฌ๋ฐ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜ํ”„ ๋ถ„์„ ์—”์ง„์ธ GraphX ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด๊ฒฐํ•จ์„ฑ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

    • Spark๋Š” ๋””์Šคํฌ I/O๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ, ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ณต๊ตฌ์— ํŠน๋ณ„ํ•œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ๊ณผ ์ฒ˜๋ฆฌ ์†๋„ ์‚ฌ์ด์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

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

  • ์ŠคํŒŒํฌ์˜ ์–ธ์–ด API

    • ์Šค์นผ๋ผ : ์ŠคํŒŒํฌ๋Š” ์Šค์นผ๋ผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์Šค์นผ๋ผ๊ฐ€ ์ŠคํŒŒํฌ์˜ ๊ธฐ๋ณธ ์–ธ์–ด

    • ์ž๋ฐ” : ์ŠคํŒŒํฌ๊ฐ€ ์Šค์นผ๋ผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ์ง€๋งŒ, ์ŠคํŒŒํฌ ์ฐฝ์‹œ์ž๋“ค์€ ์ž๋ฐ”๋ฅผ ์ด์šฉํ•ด ์ŠคํŒŒํฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ฌํ˜ˆ์„ ๊ธฐ์šธ์ž„

    • ํŒŒ์ด์ฌ : ์Šค์นผ๋ผ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•จ

    • SQL : ANSI SQL:2003 ํ‘œ์ค€ ์ค‘ ์ผ๋ถ€๋ฅผ ์ง€์›ํ•จ

    • ์ŠคํŒŒํฌ ์ฝ”์–ด์— ํฌํ•จ๋œ SparkR, R ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜ ํŒจํ‚ค์ง€์ธ sparklyr

์ŠคํŒŒํฌ api

  • RDD - ์ €์ˆ˜์ค€ API

    • image

      • https://medium.com/analytics-vidhya/spark-rdd-low-level-api-basics-using-pyspark-a9a322b58f6

    • RDD(Resilent Distributed Dataset) : ์ŠคํŒŒํฌ API์˜ ํ•ต์‹ฌ ์š”์†Œ, RDD๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜(์ฆ‰, ๋ฐ์ดํ„ฐ์…‹)์„ ์ถ”์ƒํ™”ํ•œ ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ์…‹์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ ๋ฐ ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • RDD API๋Š” Dataset๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ RDD๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์—”์ง„์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RDD์™€ Dataset ์‚ฌ์ด์˜ ์ „ํ™˜์€ ๋งค์šฐ ์‰ฌ์šฐ๋ฏ€๋กœ ๋‘ API๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด ๊ฐ API์˜ ์žฅ์ ์„ ๋™์‹œ์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • Spark์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์€ RDD๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ์ƒˆ๋กœ์šด RDD๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

    • RDD๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์†Œ๋กœ ๊ฐ€์ง€๋Š” ๋ถ„์‚ฐ ์ปฌ๋ ‰์…˜์œผ๋กœ, ํŒŒํ‹ฐ์…˜ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‚ฐ๋˜์–ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

    • RDD ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ปดํ“จํŒ… ์ž‘์—… ์Šคํ† ๋ฆฌ์ง€ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘์—… ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ์†๋„๋ฅผ 10~100๋ฐฐ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

    • ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ž‘์—…

      • image

        • https://phoenixnap.com/kb/resilient-distributed-datasets

      • Spark์—์„œ๋Š” ๋ณ€ํ™˜์„ ํ†ตํ•ด ๊ธฐ์กด RDD์—์„œ ์ƒˆ๋กœ์šด RDD๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์•ก์…˜์„ ํ†ตํ•ด RDD๋ฅผ ๊ฐ€๊ณตํ•˜์ง€ ์•Š๊ณ  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์— ํ•ด๋‹นํ•˜๊ณ  ์•ก์…˜์€ ์ตœ์ข… ๊ฒฐ๊ณผ ๊ณ„์‚ฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

      • ๋ณ€ํ™˜ : RDD๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋‚˜ ์ด์ƒ์˜ RDD๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

        • filter: ์š”์†Œ๋ฅผ ํ•„ํ„ฐ๋ง

        • map: ๊ฐ ์š”์†Œ์— ๋™์ผํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉ

        • flatmap: ๊ฐ ์š”์†Œ์— ๋™์ผํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ƒ์„ฑ

        • zip: ํŒŒํ‹ฐ์…˜ ์ˆ˜๊ฐ€ ๊ฐ™๊ณ , ํŒŒํ‹ฐ์…˜์— ์žˆ๋Š” ์š”์†Œ์˜ ์ˆ˜๋„ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ RDD๋ฅผ ์กฐํ•ฉํ•ด key-value pair๋ฅผ ๋งŒ๋“ฌ

        • ์…”ํ”Œ (Shuffle): ์…”ํ”Œ์€ ํŠน์ • ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ์—์„œ ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์š”์†Œ๊ฐ€ ๊ฐ™์€ ํŒŒํ‹ฐ์…˜์— ์œ„์น˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด RDD์˜ ์š”์†Œ๋“ค์ด ์ ์ ˆํ•œ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„๋ฐฐ๋˜๋ฉฐ, ์ด ๊ณผ์ •์€ ํŒŒํ‹ฐ์…”๋„ˆ์— ์˜ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

          • reduceByKey: ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์š”์†Œ๋ฅผ aggregation

          • join: ๋‘ ๊ฐœ์˜ RDD์—์„œ ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์š”์†Œ๋ผ๋ฆฌ join

      • ์•ก์…˜ : RDD๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์ˆ˜ํ–‰๋œ ์ž‘์—…์„ ์ถœ๋ ฅ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

        • saveAsTextFile: RDD์˜ ๋‚ด์šฉ์„ ํŒŒ์ผ๋กœ ์ถœ๋ ฅ

        • count: RDD์˜ ์š”์†Œ ์ˆ˜๋ฅผ ์…ˆ

    • ์ €์žฅ

      • image

        • https://phoenixnap.com/kb/resilient-distributed-datasets

      • RDD๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ์ €์žฅํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด RDD์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

      • RDD๋Š” ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์— ๊ฑธ์ณ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒํ‹ฐ์…”๋‹์€ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

      • Spark์˜ RDD๋Š” ์ง€์†์„ฑ ์ตœ์ ํ™” ๊ธฐ์ˆ (persistence optimization technique)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค

        • cache()

        • persist()

          • ์ŠคํŒŒํฌ์˜ RDD๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • RDD๋ฅผ ์—ฌ๋Ÿฌ ์•ก์…˜์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” RDD.persist()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ ๋“ฑ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์žฅ์ 

      • ๋ถˆ๋ณ€์„ฑ(immutable) : ์ฝ๊ธฐ ์ „์šฉ(read-only)

      • ๋ณต์›์„ฑ(resilient) : ์žฅ์•  ๋‚ด์„ฑ

      • ๋ถ„์‚ฐ(distributed) : ๋…ธ๋“œ ํ•œ ๊ฐœ ์ด์ƒ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์…‹

    • ์‚ฌ์šฉ์‹œ๊ธฐ

      • ๊ณ ์ˆ˜์ค€ API์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ(ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์น˜๋ฅผ ์•„์ฃผ ์„ธ๋งํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ)

      • RDD๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœ๋œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

      • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • DataFrame

    • image

      • https://www.nvidia.com/ko-kr/ai-data-science/spark-ebook/introduction-spark-processing/

    • Row ํƒ€์ž…์˜ ๋ ˆ์ฝ”๋“œ(ํ…Œ์ด๋ธ”์˜ ๋กœ์šฐ ๊ฐ™์€)์™€ ๊ฐ ๋ ˆ์ฝ”๋“œ์— ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ(์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ ์ปฌ๋Ÿผ ๊ฐ™์€)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

      • Row ํƒ€์ž…์€ ์ŠคํŒŒํฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์— ์ตœ์ ํ™”๋œ ์ธ๋ฉ”๋ชจ๋ฆฌ ํฌ๋งท์˜ ๋‚ด๋ถ€์ ์ธ ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(garbage collection)๊ณผ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๋ถ€ํ•˜๊ฐ€ ์žˆ๋Š” JVM ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ž์ฒด ๋ฐ์ดํ„ฐ ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • RDD์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ช…๋ช…๋œ ์—ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค โ€” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๊ตฌ์กฐ/๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” SQL ํ…Œ์ด๋ธ” ๋˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

  • DataSet

    • image

      • https://www.databricks.com/blog/2016/06/22/apache-spark-key-terms-explained.html

    • Dataset์€ ๊ตฌ์กฐ์  API์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ณ ์ˆ˜์ค€์˜ ๊ตฌ์กฐ์  API์™€ ์ €์ˆ˜์ค€ RDD API๊ฐ€ ์กฐํ•ฉ๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. โ€” ๋ฐ์ดํ„ฐ ์„ธํŠธ๋Š” ์œ ํ˜•์ด ๋งค์šฐ ์•ˆ์ „ํ•˜๋ฉฐ ์ธ์ฝ”๋”๋ฅผ ์ง๋ ฌํ™”์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ง„ ํ˜•์‹์˜ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ์— ํ……์Šคํ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐ์ดํ„ฐ ์„ธํŠธ๋Š” ํ˜•์‹์ด ์•ˆ์ „ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์„ธํŠธ ์‚ฌ์šฉ์˜ ์ฃผ์š” ์ด์ ์€ ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๋ถ„์„ ๋ฐ ๋ฐ์ดํ„ฐ ์œ ํ˜• ์ˆ˜์ •์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/๋ณ€ํ™˜ ์‹œ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋น„ํ•ด ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•˜๊ณ  ์ฝ์„ ๋•Œ ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ ์‹œ๊ธฐ

      • DataFrame ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ๋Š” ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

      • ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฐ์ˆ˜ํ•˜๋”๋ผ๋„ ํƒ€์ž… ์•ˆ์ •์„ฑ(type-safe)์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

      • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ SQL์ด๋‚˜ DataFrame ๋Œ€์‹  ๋‹จ์ผ ํ•จ์ˆ˜๋กœ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

      • ํƒ€์ž…์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž‘์—…์€ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.Dataset API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•  ์ˆ˜ ๋Š” ์—†์ง€๋งŒ ๋ณด๋‹ค ์šฐํ•˜ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ดํ•˜๊ณ  ๊ตฌ์กฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

      • ๋‹จ์ผ ๋…ธ๋“œ์˜ ์›Œํฌ๋กœ๋“œ์™€ ์ŠคํŒŒํฌ ์›Œํฌ๋กœ๋“œ์—์„œ ์ „์ฒด ๋กœ์šฐ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด Dataset์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

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

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

์ŠคํŒŒํฌ Lineage

  • image

    • http://www.prathapkudupublog.com/2018/02/lineage-of-rdd.html

  • Lineage๋Š” DAG(Directed Acyclic Graph)์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด๋Š” ์ˆœํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์„ฑ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. ์ด ๊ณณ์—๋Š” ๋ชจ๋“  RDD ์ƒ์„ฑ ๊ณผ์ •์ด ๊ธฐ๋ก๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜๋ฉด Lineage ๊ธฐ๋ก์— ๋”ฐ๋ผ ์œ ์‹ค๋˜์—ˆ๋˜ RDD๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์—ฌ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ์œ„์น˜, ๋ฐ์ดํ„ฐ ์†Œ์œ ์ž, ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ €์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ ์—ฐ์‚ฐ(lazy evaluation)

  • image

    • https://vasanth370.medium.com/apache-spark-optimization-techniques-and-tuning-e861d94d4209

  • Spark์˜ Lazy Evaluation์€ ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์ด ์‹œ์ž‘๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Apache Spark์—์„œ ์ง€์—ฐ ์—ฐ์‚ฐ์€ Spark ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•  ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

  • ์ŠคํŒŒํฌ๊ฐ€ ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์ž‘ ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

  • ํŠน์ • ์—ฐ์‚ฐ ๋ช…๋ น์ด ๋‚ด๋ ค์ง„ ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์›์‹œ ๋ฐ์ดํ„ฐ์— ์ ์šฉํ•  ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • RDD ์ž‘์—… ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ค„์ž„์œผ๋กœ์จ Apache Spark์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  • ์žฅ์ 

    • ๊ด€๋ฆฌ ์šฉ์ด์„ฑ ์ฆ๊ฐ€ : ์ž‘์—…์„ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํšŸ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

    • ๊ณ„์‚ฐ ์ ˆ์•ฝ ๋ฐ ์†๋„ ํ–ฅ์ƒ : ํ•„์š”ํ•œ ๊ฐ’๋งŒ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ๋“œ๋ผ์ด๋ฒ„์™€ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ์ด๋™์„ ์ €์žฅํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

    • ๋ณต์žก์„ฑ ๊ฐ์†Œ : ๋ชจ๋“  ์ž‘์—…์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.์ž‘์—…์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค

    • ์ตœ์ ํ™” : ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์ค„์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

Tungsten Project

  • image

    • https://spoddutur.github.io/spark-notes/deep_dive_into_storage_formats.html

  • Tungsten์€ Apache Spark์˜ ์‹คํ–‰ ์—”์ง„์„ ๋ณ€๊ฒฝํ•˜์—ฌ Spark ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ˜„๋Œ€ ํ•˜๋“œ์›จ์–ด์˜ ํ•œ๊ณ„์— ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“œ๋Š” ์šฐ์‚ฐ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ช…์ž…๋‹ˆ๋‹ค.

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

    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐ ์ด์ง„ ์ฒ˜๋ฆฌ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ๋งจํ‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  JVM ๊ฐœ์ฒด ๋ชจ๋ธ ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    • ์บ์‹œ ์ธ์‹ ๊ณ„์‚ฐ : ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

    • ์ฝ”๋“œ ์ƒ์„ฑ : ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ CPU ํ™œ์šฉ

    • ๊ฐ€์ƒ ํ•จ์ˆ˜ ๋””์ŠคํŒจ์น˜ ์—†์Œ : ์ด๋Š” ์ˆ˜์‹ญ์–ต ๋ฒˆ ๋””์ŠคํŒจ์น˜ํ•  ๋•Œ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ CPU ํ˜ธ์ถœ์„ ์ค„์ž…๋‹ˆ๋‹ค.

    • ๋ฉ”๋ชจ๋ฆฌ ๋Œ€ CPU ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ : Tungsten Phase 2๋Š” ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ CPU ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์‹  CPU ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์ฃผ๊ธฐ ์ˆ˜์˜ ํฌ๊ธฐ ๊ฐ์†Œ์ž…๋‹ˆ๋‹ค.

    • ๋ฃจํ”„ ์–ธ๋กค๋ง ๋ฐ SIMD : Apache Spark์˜ ์‹คํ–‰ ์—”์ง„์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ for ๋ฃจํ”„(๋ณต์žกํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„์™€ ๋ฐ˜๋Œ€)๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ……์Šคํ… ์—”์ง„ : ๊ฐ์ฒด(์ •์ˆ˜ํ˜•,๋ฌธ์ž์—ด,ํŠœํ”Œ ๋“ฑ)๋ฅผ ์ด์ง„์ˆ˜๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

    • ์˜จ-ํž™ ํ• ๋‹น ๋ชจ๋“œ : ์ด์ง„์ˆ˜๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ์ฒด๋ฅผ JVM์ด ๊ด€๋ฆฌํ•œ๋А ๋Œ€๊ทœ๋ชจ long ๋ฐฐ์—ด์— ์ €์žฅ

    • ์˜คํ”„-ํž™ ํ• ๋‹น ๋ชจ๋“œ : sun.misc.Unsafe ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋งˆ์น˜ C ์–ธ์–ด์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฃผ์†Œ๋กœ ์ง์ ‘ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œ

์ŠคํŒŒํฌ ๋ฆฌ์†Œ์Šค ํ• ๋‹น ๋ฐ ํŠœ๋‹

  • ๋ฆฌ์†Œ์Šค ํ• ๋‹น

    • image

      • https://docs.cloudera.com/cdp-private-cloud-base/7.1.6/tuning-spark/topics/spark-admin-tuning-resource-allocation.html

    • ์ฝ”์–ด ์ˆ˜ = ์‹คํ–‰์ž๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ ์ž‘์—…

    • Spark์™€ YARN์ด ๊ด€๋ฆฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฆฌ์†Œ์Šค๋Š” CPU์™€ ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋””์Šคํฌ ๋ฐ ๋„คํŠธ์›Œํฌ I/O๋„ Spark ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ Spark์™€ YARN ๋ชจ๋‘ ์ด๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ๊ฐ๊ฐ 16๊ฐœ์˜ ์ฝ”์–ด์™€ 64GB์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žฅ์ฐฉ๋œ NodeManager๋ฅผ ์‹คํ–‰ํ•˜๋Š” 6๊ฐœ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์ผ ๋•Œ(๊ฐ ๋…ธ๋“œ์— 15๊ฐœ์˜ ์ฝ”์–ด, 63GB RAM์ด ์žˆ์Šต๋‹ˆ๋‹ค. --num-executors 6 --executor-cores 15 --executor-memory 63G)

      • ํ˜ธ์ŠคํŠธ๋Š” OS ๋ฐ Hadoop ๋ฐ๋ชฌ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค์˜ 100%๋ฅผ YARN ์ปจํ…Œ์ด๋„ˆ์— ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•ด 1GB์™€ 1์ฝ”์–ด๋ฅผ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค.

      • 6 * 15 = 90core - ํ˜ธ์ŠคํŠธ๋Š” OS ๋ฐ Hadoop ๋ฐ๋ชฌ์„ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค ํ• ๋‹น ํ›„ ์ตœ๋Œ€ ์ฝ”์–ด์ž…๋‹ˆ๋‹ค.

      • 90core / 5core = 18 executors ๋กœ ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋Š” 3 executors์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 1 excutor๋Š” ํ˜ธ์ŠคํŠธ๋Š” OS ๋ฐ Hadoop ๋ฐ๋ชฌ์„ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ค๋ฒ„ํ—ค๋“œ ๊ณ„์‚ฐ

        • 63 GB / 3 = 21 GB

        • 21 * (1-0.07) ~ 19 GB

        • ์˜ค๋ฒ„ํ—ค๋“œ์— ๋Œ€ํ•œ ๊ณต์‹์€ max(384, 0.07 * spark.executor.memory)๋กœ ์˜ค๋ฒ„ํ—ค๋“œ ๊ณ„์‚ฐ: 0.07 * 21(63/3) = 1.47๋กœ 21-1.47 ~ 19GB

      • ๋™์‹œ ์ž‘์—…์ด 5๊ฐœ ์ด์ƒ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋‚˜์œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์–ด ์ตœ์ ์˜ ๊ฐ’์€ 5์ž…๋‹ˆ๋‹ค.

      • --num-executors 17 --executor-cores 5 --executor-memory 19G

  • ๋™์  ํ• ๋‹น

    • ์ŠคํŒŒํฌ ์›Œํฌ๋กœ๋“œ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฐจ์ง€ํ•  ์ž์›์„ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • ๋™์  ํ• ๋‹น์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์‹คํ–‰๊ธฐ ์ˆ˜์˜ ์ƒํ•œ์€ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ŠคํŒŒํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์š”๊ตฌ ์‚ฌํ•ญ(๋ฐ์ดํ„ฐ ํฌ๊ธฐ, ํ•„์š”ํ•œ ๊ณ„์‚ฐ๋Ÿ‰)์— ๋”ฐ๋ผ ๊ฐ’์ด ์„ ํƒ๋˜๊ณ  ์‚ฌ์šฉ ํ›„ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ž์›์„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • spark.dynamicAllocation.enabled ์†์„ฑ๊ฐ’์„ true๋กœ ์„ค์ •

์ง๋ ฌํ™”

  • image

    • https://www.databricks.com/glossary/spark-tuning

  • image

    • https://www.linkedin.com/pulse/pyspark-tunning-data-serialization-saikrishna-cheruvu-/

    • Spark๋Š” ๋„คํŠธ์›Œํฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์“ธ ๋•Œ ๊ฐ์ฒด๋“ค์„ ์ง๋ ฌํ™”ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Java์— ๋‚ด์žฅ๋œ ์ง๋ ฌํ™”๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ, Spark๋Š” Java ์ง๋ ฌํ™”๋ณด๋‹ค ํ›จ์”ฌ ํ–ฅ์ƒ๋œ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Kryo๋ฅผ ์“ฐ๋Š”๊ฒƒ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • Java ์ง๋ ฌํ™”

    • ๊ฐœ์ฒด๋Š” ObjectOutputStream ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Spark์—์„œ ์ง๋ ฌํ™”๋˜๋ฉฐ java.io.Serializable์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ง๋ ฌํ™” ์„ฑ๋Šฅ์€ java.io.Externalizable์„ ํ™•์žฅํ•˜์—ฌ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์œ ์—ฐํ•˜์ง€๋งŒ ๋А๋ฆฌ๊ณ  ๋งŽ์€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ํฐ ์ง๋ ฌํ™” ํ˜•์‹์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

  • Kryo ์ง๋ ฌํ™” โ€“ Spark๋Š” Kryo ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒ„์ „ 4)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ง๋ ฌํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Kryo๋Š” Java ์ง๋ ฌํ™”(์ข…์ข… ์ตœ๋Œ€ 10๋ฐฐ)๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์ปดํŒฉํŠธํ•˜์ง€๋งŒ ๋ชจ๋“  Serializable์œ ํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • SparkConf ๋กœ ์ž‘์—…์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Karyo ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Reference

  • https://www.amazon.com/Spark-Definitive-Guide-Processing-Simple/dp/1491912219

  • https://www.databricks.com/glossary/tungsten

  • https://itnext.io/apache-spark-internals-tips-and-optimizations-8c3cad527ea2

  • https://vasanth370.medium.com/apache-spark-optimization-techniques-and-tuning-e861d94d4209

  • https://docs.cloudera.com/cdp-private-cloud-base/7.1.6/tuning-spark/topics/spark-admin-tuning-resource-allocation.html

  • https://www.databricks.com/glossary/spark-tuning

  • https://spark.apache.org/docs/latest/tuning.html

Last updated