spark_base
Spark
์คํํฌ ์ํฌ๋ก๋
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
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๋ฐฐ ํฅ์์ํต๋๋ค.
๋ ๊ฐ์ง ์ ํ์ ์์
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์ ์์ ์๋ฅผ ์
์ ์ฅ
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
https://www.nvidia.com/ko-kr/ai-data-science/spark-ebook/introduction-spark-processing/
Row ํ์ ์ ๋ ์ฝ๋(ํ ์ด๋ธ์ ๋ก์ฐ ๊ฐ์)์ ๊ฐ ๋ ์ฝ๋์ ์ํํ ์ฐ์ฐ ํํ์์ ๋ํ๋ด๋ ์ฌ๋ฌ ์ปฌ๋ผ(์คํ๋ ๋์ํธ์ ์ปฌ๋ผ ๊ฐ์)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Row ํ์ ์ ์คํํฌ๊ฐ ์ฌ์ฉํ๋ ์ฐ์ฐ์ ์ต์ ํ๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํฌ๋งท์ ๋ด๋ถ์ ์ธ ํํ ๋ฐฉ์์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ (garbage collection)๊ณผ ๊ฐ์ฒด ์ด๊ธฐํ ๋ถํ๊ฐ ์๋ JVM ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํ๋ ๋์ ์์ฒด ๋ฐ์ดํฐ ํฌ๋งท์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํจ์จ์ ์ธ ์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
RDD์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ฒ๋ผ ๋ช ๋ช ๋ ์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค โ ๋ฐ์ดํฐ ํ๋ ์์ ๊ตฌ์กฐ/๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ์ ์ ์ฅํ ์ ์๋ SQL ํ ์ด๋ธ ๋๋ 2์ฐจ์ ๋ฐฐ์ด๋ก ์๊ฐํ ์ ์์ต๋๋ค.
ํ ์ด๋ธ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ ๋๋ค.
DataSet
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
http://www.prathapkudupublog.com/2018/02/lineage-of-rdd.html
Lineage๋ DAG(Directed Acyclic Graph)์ ํํ๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด๋ ์ํํ์ง ์๋ ๋ฐฉํฅ์ฑ ๊ทธ๋ํ์ ๋๋ค. ์ด ๊ณณ์๋ ๋ชจ๋ RDD ์์ฑ ๊ณผ์ ์ด ๊ธฐ๋ก๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋๋ฉด Lineage ๊ธฐ๋ก์ ๋ฐ๋ผ ์ ์ค๋์๋ RDD๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ถ๋ฐ์ง์์ ๋ชฉ์ ์ง๊น์ง์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ํฌํจํ์ฌ ๋ฐ์ดํฐ์ ์ฌ์ ์ ์๊ฐ์ ์ผ๋ก ํํํ๊ณ , ๋ฐ์ดํฐ๊ฐ ์ด๋ํ๋ ์์น, ๋ฐ์ดํฐ ์์ ์, ๊ฐ ๋จ๊ณ์์ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๊ณ ์ ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ง์ฐ ์ฐ์ฐ(lazy evaluation)
https://vasanth370.medium.com/apache-spark-optimization-techniques-and-tuning-e861d94d4209
Spark์ Lazy Evaluation์ ์์ ์ด ํธ๋ฆฌ๊ฑฐ๋ ๋๊น์ง ์คํ์ด ์์๋์ง ์์์ ์๋ฏธํฉ๋๋ค. Apache Spark์์ ์ง์ฐ ์ฐ์ฐ์ Spark ๋ณํ์ด ๋ฐ์ํ ๋ ๋ํ๋ฉ๋๋ค.
์คํํฌ๊ฐ ์ฐ์ฐ ๊ทธ๋ํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ง์ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค.
์คํํฌ๋ ๋ชจ๋ ํธ๋์คํฌ๋ฉ์ด์ ์ ์ฐ๊ณ๋ฅผ ํ๋ฒ์ ํ์ ํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ์ฐ์ฐํ๋ ์ง์ฐ ์ฐ์ฐ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋, ์คํํฌ๋ ์ค์ ๋ฐ์ดํฐ ๋์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๊ณ ์ ์ฅํฉ๋๋ค. ์ด๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ์ดํดํ๊ธฐ์ ๋ ์ฉ์ดํฉ๋๋ค.
ํน์ ์ฐ์ฐ ๋ช ๋ น์ด ๋ด๋ ค์ง ์ฆ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์๊ณ ์์ ๋ฐ์ดํฐ์ ์ ์ฉํ ํธ๋์คํฌ๋ฉ์ด์ ์ ์คํ ๊ณํ์ ์์ฑํฉ๋๋ค.
RDD ์์ ์ ์คํ ์๊ฐ์ ์ค์์ผ๋ก์จ Apache Spark์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์ฅ์
๊ด๋ฆฌ ์ฉ์ด์ฑ ์ฆ๊ฐ : ์์ ์ ๊ทธ๋ฃนํํ์ฌ ๋ฐ์ดํฐ ์ ๋ฌ ํ์๋ฅผ ์ค์ ๋๋ค.
๊ณ์ฐ ์ ์ฝ ๋ฐ ์๋ ํฅ์ : ํ์ํ ๊ฐ๋ง ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ๊ณ์ฐ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ๋๋ผ์ด๋ฒ์ ํด๋ฌ์คํฐ ๊ฐ์ ์ด๋์ ์ ์ฅํ์ฌ ํ๋ก์ธ์ค ์๋๋ฅผ ๋์ ๋๋ค.
๋ณต์ก์ฑ ๊ฐ์ : ๋ชจ๋ ์์ ์ ์คํํ์ง ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ ์ฝ๋ฉ๋๋ค.์์ ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋๋ง ํธ๋ฆฌ๊ฑฐ๋๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ์ค์ด๋ญ๋๋ค
์ต์ ํ : ์ฟผ๋ฆฌ ์๋ฅผ ์ค์ฌ ์ต์ ํํฉ๋๋ค.
Tungsten Project
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 ์ธ์ด์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ์๋ก ์ง์ ํ ๋นํ๊ณ ํด์
์คํํฌ ๋ฆฌ์์ค ํ ๋น ๋ฐ ํ๋
๋ฆฌ์์ค ํ ๋น
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๋ก ์ค์
์ง๋ ฌํ
https://www.databricks.com/glossary/spark-tuning
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