[Spark] Apache Spark๋?
๐ Apache Spark๋?
Apache Spark ๋ ๋น
๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ถ์ ์์ง์ด๋ค. Hadoop ์ MapReduce ๊ฐ ๋์คํฌ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ๋ฉด, Spark๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋ณ๋ ฌ ์ฐ์ฐ์ ์งํํ๋ค.
์ผ๋ฐ์ ์ผ๋ก Spark๊ฐ Hadoop MapReduce๋ณด๋ค 100๋ฐฐ ์ ๋ ๋น ๋ฅด๋ค.
๐ ํน์ง
- ๋ฐฐ์น ํ๋ก์ธ์ฑ์ ํตํด ์ผ์  ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
 - ์คํธ๋ฆฌ๋ฐ ํ๋ก์ธ์ฑ์ ํตํด ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ  ์ ์๋ค. Spark์ 
Structured Streaming๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ณ์ํด์ ํ์ด ์ถ๊ฐ๋๋ ๋ฌดํํ ํ ์ด๋ธ๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์, ์ค์๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์์ ๋จ์๋ก ๋๋์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. - ๋ถ์ฐ ํด๋ฌ์คํฐ ์ปดํจํ
์ ํตํด ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ  ์ ์๋ค. Spark๋ ๋์ง ์์ ์คํ์ ๋
ธ๋๋ค์ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ์ฌ ํ๋์ ๊ฑฐ๋ํ ๋
ธ๋์ฒ๋ผ ์ฌ์ฉํ๋ค. ์ด๋ฅผ 
scale-out์ด๋ผ๊ณ ํ๋ค. HDFS,S3๋ฑ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์์ ํตํฉ๋ ์ ์๋ค. Spark ์์ฒด๋ ๊ณ์ฐ๋ง ๋ด๋นํ๋ฉฐ, ํน์  ์ ์ฅ์์ ์ข ์๋์ง ์๋๋ค. ์ฆ, Spark๋ ๊ณ์ฐ ์์ง๊ณผ ์ ์ฅ์๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค.- ํ์ด์ฌ, ์ค์นผ๋ผ, R, SQL ๋ฑ๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ค.
 - ๋ฐฐ์น ํ๋ก์ธ์ฑ๊ณผ ์คํธ๋ฆฌ๋ฐ ํ๋ก์ธ์ฑ์ 
wrapper๋ง ์์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ๋ฐฐ์น ๋ฐ์ดํฐ ๋ก์ง๊ณผ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ด ๊ฑฐ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. 
๐ ๊ตฌ์กฐ
ํ๋์ ํด๋ฌ์คํฐ๋ ํ๋์ master node ์ ์ฌ๋ฌ ๊ฐ์ worker node ๋ก ๊ตฌ์ฑ๋๋ค.
์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ ๋ ธ๋๊ฐ master node์ด๋ค.
cluster manager๋ ์ ์ฒด ํด๋ฌ์คํฐ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ ๋ถ๋ฐฐํ๋ค.
master node๋ driver ํ๋ก์ธ์ค๋ฅผ ์ํํ๋ค. ์์ฑํ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ plan์ ์๋ฆฝํ๋ฉฐ, worker node์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ค.
๋ฐ๋ฉด worker node๋ executor ํ๋ก์ธ์ค๋ฅผ ์ํํ๋ค. master node๋ก๋ถํฐ ํ ๋น๋ฐ์ ์์ ์ ์ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฉฐ, ๋ค๋ฅธ worker node์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์  ์คํ ํ๋ก์ธ์ค
- ์ฌ์ฉ์๊ฐ Spark ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด ๋จผ์  driver ํ๋ก์ธ์ค๊ฐ ์์๋๋ค. ๋๋ผ์ด๋ฒ ๋ด๋ถ์ 
SparkContext๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.SparkContext๊ฐ์ฒด๋ Spark ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํ entrypoint์ด๋ค. SparkContext๊ฐYARN,k8s์ ๊ฐ์ ํด๋ฌ์คํฐ ๋งค๋์ ์ ํต์ ํ์ฌ ํ์ํ ์์์ ์์ฒญํ๋ค. ํด๋ฌ์คํฐ ๋งค๋์ ๋ ์์ฒญ์ ๋ฐ๊ณ ์ฌ๋ฌ worker node์ ์์์ ํ ๋นํ๊ณ worker node ์์์ executor ํ๋ก์ธ์ค๋ฅผ ์คํ์ํจ๋ค.- executor๊ฐ ์คํ๋๋ฉด driver์๊ฒ ์์ ์ ์์น๋ฅผ ๋ฑ๋กํ๋ค. ์ฆ, ๋๋ผ์ด๋ฒ๋ ์ด ์์ ์ ์ด๋ค executor๊ฐ ์ด๋์ ๋์ํ๋์ง ์๊ฒ ๋๋ค. ์ฌ์ฉ์์ 
action์ด ํธ์ถ๋๋ฉด ๋๋ผ์ด๋ฒ๋ ์ด๋ฅผjob์ผ๋ก ๋ณํํ๊ณ ์ฌ๋ฌ ๊ฐ์stage๋ก ๋๋๋ค. ๊ฐstage๋ ์ฌ๋ฌ ๊ฐ์task๋ก ์ชผ๊ฐ์ง๋ค. ๋๋ผ์ด๋ฒ๋ ์ดtask๋ฅผ executor์ ์ง์  ์ ๋ฌํ์ฌ ์คํ์ ์ง์ํ๋ค. - ๊ฐ๊ฐ์ executor๋ ํ ๋น๋ฐ์ ํ์คํฌ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋๋ผ์ด๋ฒ์ ๋ณด๊ณ ํ๋ค.
 
๊ฐ๊ฐ์ executor๋ ์์ ์ด ๊ณ์ฐํ ํํฐ์ ์ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋์คํฌ์ ์บ์ฑํ๋๋ฐ, ์ด๋ฅผ ํตํด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
groupby, join ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ์ ์ฌ๋ถ๋ฐฐ๊ฐ ํ์ํ ์ฐ์ฐ์ ์ํํ  ๋ ๊ฐ executor๋ ๋ค๋ฅธ executor์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ฐ, ์ด ๊ณผ์ ์ shuffling ์ด๋ผ๊ณ  ํ๋ค. ๋ค๋ง shuffling ์ ๋์คํฌ I/O์ ๋คํธ์ํฌ ํต์  ๋ชจ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ํฐ ์ฐ์ฐ์ด๋ฉฐ, ์ด๋ฅผ ์ต์ํํ๋ ๊ฒ์ด Spark ์ฑ๋ฅ ํ๋์ ํต์ฌ์ด๋ค.
groupby๋join์ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ๋ผ๋ฆฌ ํ ๊ณณ์ ๋ชจ์์ผ ํ๋ ์ฐ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ฌ๋ถ๋ฐฐ๊ฐ ํ์ํ ๊ฒ์ด๋ค.
ํด๋ฌ์คํฐ์ ์ข ๋ฅ
- ์จํ๋ ๋ฏธ์ค ํด๋ฌ์คํฐ๋ ์์ฒด์ ์ธ ๋ฐ์ดํฐ ์ผํฐ์ ๋ฌผ๋ฆฌ์  ์๋ฒ๋ฅผ ํตํด ์ง์  ๊ตฌ์ถํ๋ ํด๋ฌ์คํฐ์ด๋ค. ์ด๊ธฐ ๋น์ฉ์ ๋์ผ๋ ์ดํ ์ถ๊ฐ์ ์ธ ์ธํ๋ผ ๋น์ฉ์ ๊ฑฐ์ ์์ผ๋, ์ง์  ์ ์ง๋ณด์ํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
 - ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋ AWS EMR, Google Dataproc, Azure HDInsight์ ๊ฐ์ด ํด๋ผ์ฐ๋ ๋ฒค๋์์ ์ ๊ณตํ๋ ์๋น์ค๋ฅผ ํตํด ์ฌ์ฉํ๋ ํด๋ฌ์คํฐ์ด๋ค. ํ์ฅ์ฑ์ด ์ข๊ณ ๊ด๋ฆฌ ์ธก๋ฉด์์ ํธ๋ฆฌํ๋, ์ง์์ ์ธ ์ด์ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
 - ํ์ด๋ธ๋ฆฌ๋ ํด๋ฌ์คํฐ๋ ์จํ๋ ๋ฏธ์ค์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋ฅผ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํ์์๋ ์จํ๋ ๋ฏธ์ค ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ค, ํธ๋ํฝ ํผํฌ๊ฐ ๋ฐ์ํ๋ฉด ํด๋ผ์ฐ๋๋ก๋ถํฐ ์ถ๊ฐ ๋ ธ๋๋ฅผ ์์๋ก ๋์ฌํ์ฌ ํ์ฅ์ฑ์ ์ฑ๊ธด๋ค.
 
ํด๋ฌ์คํฐ์ ์ฅ์ 
- ๋ณ๋ด ์ฒ๋ฆฌ ๋ฐฉ์์ ํตํด ์์ ์ํ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์๋ค.
 - scale-out ๋ชจ๋ธ์ ์ฑํํ๋ฏ๋ก ์๋์ ์ผ๋ก ๋น์ฉ์ด ์ ๋ ดํ๋ฉฐ, ์ํ์ ์ผ๋ก ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ ์์ด ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
 - ํน์  ๋
ธ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ๋ค๋ฅธ ๋
ธ๋๊ฐ ๊ทธ ์์
์ ๋์  ์ํํ์ฌ ์์ ์ฑ์ ์ ์งํ๋ค. ์ด๋ฅผ 
Fault Tolerance๋ผ๊ณ ํ๋ค. 
YARN ์ํคํ ์ฒ
ResourceManager๋ master node์์ ์คํ๋๋ค. ํด๋ฌ์คํฐ์ ๋ชจ๋ ์์์ ๊ด๋ฆฌํ๋ฉฐ ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์ ํ ๋นํ ์ง ๊ฒฐ์ ํ๋ค.NodeManager๋ slave node์์ ์คํ๋๋ฉฐ, ์์ ์ด ์ํ ๋ ธ๋์ ์์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ResourceManager์๊ฒ ๋ณด๊ณ ํ๊ณ , ResourceManager์ ๋ช ๋ น์ ๋ฐ์Container๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํ๋ค.ApplicationMaster๋ ์ ํ๋ฆฌ์ผ์ด์  ๋น ํ๋ ์กด์ฌํ๋ ์ปจํ ์ด๋๋ก, ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ResourceManager๋ฅผ ํตํด ํ์ํ ์ปจํ ์ด๋๋ฅผ ํ ๋น๋ฐ๊ณ , ํด๋น ์ปจํ ์ด๋์ task๊ฐ ์คํ๋๋๋ก NodeManager์ ์์ฒญํ๋ค.Container๋ NodeManager๊ฐ ๊ด๋ฆฌํ๋ ์์ ํ ๋น ๋จ์๋ก, ์ค์  task๊ฐ ์ปจํ ์ด๋ ์์์ ์คํ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์คํ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Spark ๋๋ MapReduce job์ ํด๋ฌ์คํฐ์ ์ ์ถํ๋ค. ํด๋ผ์ด์ธํธ๋ ResourceManager์๊ฒ ์ ํ๋ฆฌ์ผ์ด์  ์คํ์ ์์ฒญํ๋ค.
 - ์์ฒญ์ ๋ฐ์ ResourceManager๋ ApplicationMaster ํ๋ก์ธ์ค๋ฅผ ์ปจํ ์ด๋ ์์์ ์์์ํจ๋ค.
 - ApplicationMaster๋ ๊ด๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ฌํญ์ ํ์ ํ ํ ResourceManager์๊ฒ ํ์ํ ์์์ ์ง์  ์์ฒญํ๋ค.
 - ResourceManager๋ ์์ฒญ๋ฐ์ ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ NodeManger์๊ฒ ํ ๋นํ๋ค. ApplicationMaster์๊ฒ ์์ฒญํ ์ปจํ ์ด๋๋ฅผ ์ด๋ ๋ ธ๋์์ ์ฌ์ฉํ ์ ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
 - ์ปจํ ์ด๋ ์์น ์ ๋ณด๋ฅผ ๋ฐ์ ApplicationMaster๋ NodeManager์ ์ง์  ํต์ ํ์ฌ ์ปจํ ์ด๋์ ์ค์  task๋ฅผ ์คํํ๋๋ก ์ง์ํ๋ค.
 - ๋ชจ๋ task๊ฐ ์๋ฃ๋๋ฉด ResourceManager์๊ฒ ๋ฑ๋ก์ ํด์ ํ๊ณ , ์์์ ํด๋ฌ์คํฐ์ ๋ฐ๋ฉํ๋ค.
 
PySpark ์ํคํ ์ฒ
PySpark ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ด์ฌ๊ณผ ์๋ฐ๊ฐ ์ ๊ธฐ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ๋์ํ๋ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ์ด๋ค. ์์
 ์ง์๋ ํ์ด์ฌ, ์คํ์ JVM์์ ์ด๋ฃจ์ด์ง๋ค. ์ด๋ค์ ์ง์  ์ํตํ  ์ ์๋๋ฐ, Py4J ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ฌ์ด ๋ค๋ฆฌ ์ญํ ์ ํ๋ค.
๊ตฌ์ฒด์ ์ธ ์คํ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
- PySpark ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ ํ๋ก์ธ์ค๊ฐ ์์๋๊ณ , 
SparkSession๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. - ์ดํ ํ์ด์ฌ ๋๋ผ์ด๋ฒ๋ ๋ด๋ถ์ ์ผ๋ก JVM์ ์คํํ๊ณ Py4J ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด JVM๊ณผ ์์ผ ํต์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ค.
 - ์ดํ ์์ ์ ์ด์ ๊ณผ ๊ฐ๋ค.
 
์์ฑ๋ ํ์คํฌ๋ฅผ executor์ ์ ๋ฌํ์ฌ ์คํ์ ์ง์ํ ๋, ์ฐ์ฐ์ ์ข ๋ฅ์ ๋ฐ๋ผ ์คํ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
select, filter, groupBy ์ ๊ฐ์ด ๋ฐ์ดํฐํ๋ ์์ ์ต์ ํ๋ ๋ด์ฅ ํจ์๋ค์ ์ ๋ถ executor JVM์์ ์ค์นผ๋ผ ์ฝ๋๋ก ์คํ๋๋ค. ๋ฐ๋ผ์ ํ์ด์ฌ๊ณผ JVM ๊ฐ ๋ฐ์ดํฐ ์ด๋์ด ์์ด ๋น ๋ฅด๊ณ  ํจ์จ์ ์ด๋ค.
์ฌ์ฉ์ ์ ์ ํจ์(UDF)๋ RDD์ map ์ฐ์ฐ์ฒ๋ผ ํ์ด์ฌ ์์ปค๊ฐ ํ์ํ ๊ฒฝ์ฐ JVM์ ๋ณ๋์ ํ์ด์ฌ ์์ปค ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค. executor JVM์ ์ฒ๋ฆฌํ  ๋ฐ์ดํฐ ํํฐ์
์ ์ง๋ ฌํํ ํ ์์ผ์ ํตํด ํ์ด์ฌ ์์ปค๋ก ์ ์กํ์ฌ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ํ, ๋ค์ ์ง๋ ฌํํ์ฌ JVM์ผ๋ก ๋๋ ค๋ณด๋ธ๋ค.
๐ ๊ตฌ์ฑ ์์
Spark๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ด ์ธต์ ์ด๋ฃจ๊ณ  ์๋ ํตํฉ ๋ถ์ ์์ง์ด๋ค. ๋ชจ๋  ์ปดํฌ๋ํธ๋ค์ Spark Core ๋ผ๋ ํต์ฌ ์์ง ์์์ ๋์ํ๋ค. Spark Core ๋ ๊ธฐ๋ณธ์ ์ธ ์
์ถ๋ ฅ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฅ์  ๋ณต๊ตฌ์ ๊ฐ์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ํ ์ ์์ค ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ, Spark์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๋ชจ๋ธ์ธ RDD(Resilient Distributed Dataset) API๋ฅผ ์ ๊ณตํ๋ค.
Spark Core ์์์ ๋์ํ๋ ๋ค ๊ฐ์ง ๊ณ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์๋ณด์.
Spark SQL์ (๋ฐ)์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ์ปดํฌ๋ํธ์ด๋ฉฐ, SQL ์ฟผ๋ฆฌ ๋๋DataFrame์ ํตํด ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ก ํ๋ค. ์์ฑ๋ SQL ์ฟผ๋ฆฌ ๋๋ DataFrame์Catalyst Optimizer๋ผ๋ ์ฟผ๋ฆฌ ์ต์ ํ ์์ง์ ํตํด ํจ์จ์ ์ธ RDD ์ฐ์ฐ plan์ผ๋ก ๋ณํํ ํ ์ฒ๋ฆฌํ๋ค.
Spark์ DataFrame์ RDD์ ์คํค๋ง๋ฅผ ๋ถ์ฌํ ๊ฒ์ด๋ค.
Spark Streaming์Kafka๋ฑ์ผ๋ก๋ถํฐ ์ค์๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ปดํฌ๋ํธ์ด๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์งง์ ์๊ฐ ๋จ์์ ๋ง์ดํฌ๋ก ๋ฐฐ์น๋ก ๋๋ ํ ์ฒ๋ฆฌํ๋ค.MLlib์ ๋น ๋ฐ์ดํฐ๋ฅผ ์ํ ๋จธ์ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๋ ฌ๋ก ์คํ๋๋๋ก ์ค๊ณ๋์๋ค.GraphX๋ ๊ทธ๋ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ์ปดํฌ๋ํธ๋กPageRank,Connected Components์ ๊ฐ์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ค.
๐ RDD์ ํน์ง
RDD(Resilient Distributed Dataset) ์ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐ๋์ด ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋  ์ ์๋ ๋ถ๋ณ ๋ฐ์ดํฐ ์์์ ์ปฌ๋ ์
์ด๋ค. ๋ถ๋ณ์ฑ์ด RDD์ ๊ฐ์ฅ ์ค์ํ ํน์ง ์ค ํ๋์ธ๋ฐ, ๊ธฐ์กด RDD๋ฅผ ํตํด ์๋ก์ด RDD๋ฅผ ์์ฑํ๊ธฐ ์ํด map ์ด๋ filter ์ ๊ฐ์ ์ฐ์ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
RDD๋ ํ๋์ ๊ฑฐ๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ ์์ ํํฐ์ ์ผ๋ก ๋๋์ด ํด๋ฌ์คํฐ์ ์ฌ๋ฌ ์์ปค ๋ ธ๋์ ๋ถ์ฐ ์ ์ฅ๋๋ค. Spark๋ ๊ฐ๊ฐ์ ํํฐ์ ์ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ค๋ฃฌ๋ค.
Spark๋ RDD๊ฐ ์ด๋ค ๊ณผ์ ์ ํตํด ์์ฑ๋์๋์ง์ ๋ํ ์ ๋ณด(lineage)๋ฅผ ๊ธฐ์ตํ๋ค. ํน์  ์์ปค ๋ ธ๋๊ฐ ๋ค์ด๋์ด ์ผ๋ถ ํํฐ์ ์ด ์ ์ค๋๋ค๋ฉด, ๊ธฐ์ตํ ์ ๋ณด๋ฅผ ํตํด ์ฌ๋ผ์ง ํํฐ์ ์ ๊ณ์ฐํ์ฌ ๋ณต๊ตฌํ๋ค.
Spark๋ transformation, action ๋ ๊ฐ์ง ์ฐ์ฐ์ ๊ฐ์ง๊ณ  ์๋๋ฐ, ๋ณํ ์ฐ์ฐ์ ํธ์ถ๋๋ ์ฆ์ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ก์
 ์ฐ์ฐ์ด ํธ์ถ๋๋ฉด ์ ์๋ ๋ชจ๋  ๋ณํ ์ฐ์ฐ์ด ์ค์ ๋ก ์ํ๋๋ค. ์ด๋ฅผ lazy evaluation ์ด๋ผ๊ณ  ํ๋ค.
๐ pyspark์ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋
1
sc = pyspark.SparkContext('local[*]')
SparkContext ๋ฉ์๋์ master ํ๋ผ๋ฏธํฐ๋ Spark ์์
์ ์ด๋์ ์คํํ ์ง ์ง์ ํ๋ ํด๋ฌ์คํฐ URL์ด๋ค. local[*] ๋ก ์ค์ ํ๋ฉด, ํด๋ฌ์คํฐ๊ฐ ์๋ ๋ก์ปฌ ๋จธ์ ์์ Spark๋ฅผ ์คํํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค. ๋๊ดํธ ์์๋ ์ฌ์ฉํ  ์ฝ์ด์ ์๋ฅผ ์
๋ ฅํ๋ฉฐ, asterisk๋ฅผ ์
๋ ฅํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋  CPU ์ฝ์ด๋ฅผ ์ต๋ํ ํ์ฉํ๋ค.
SparkContext ๋ ์ฑ๊ธํด ํจํด์ผ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ํ๋์ Spark ์ ํ๋ฆฌ์ผ์ด์
 ๋ด์๋ ์ค์ง ํ๋์ SparkContext ๋ง ์กด์ฌํ  ์ ์๋ค. ๋ฐ๋ผ์ ์์ฑ๋ค sc ๋ฅผ ๊ณ์ํด์ ์ฌํ์ฉํ  ์ ์๋ค.
์ด๋ฏธ SparkContext ๊ฐ ์คํ ์ค์ธ ์ํ์์ SparkContext ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ฏธ ์์ฑ๋ context๋ฅผ ์์ ํ๊ฒ ๊ฐ์ ธ์ค๊ธฐ ์ํด getOrCreate ๋ฉ์๋๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ค.
1
2
rdd = sc.parallelize(range(1000))
rdd.takeSample(False, 5)
parallelize ๋ฉ์๋๋ ๋ฆฌ์คํธ๋ ํํ๊ฐ์ ํ์ด์ฌ ์ปฌ๋ ์
์ RDD๋ก ๋ณํํ๋ค. parallelize(range(1000)) ๋ 0๋ถํฐ 999๊น์ง์ ์ซ์๊ฐ ์๋ RDD๋ฅผ ์์ฑํ๊ณ  ์ด๋ค์ ์ฌ๋ฌ ํํฐ์
์ ๋๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ก ํํฐ์
์ ๊ฐ์์ธ numSlices ๋ฅผ ๋ฐ์ ์ ์๋ค.
takeSample ๋ฉ์๋๋ RDD์์ ๋ฌด์์๋ก ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๊ฐ์ ธ์ค๋ action ์ฐ์ฐ์ด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์์ธ withReplacement ๋ ๋ณต์ ์ถ์ถ ์ฌ๋ถ์ด๋ฉฐ, ๋ ๋ฒ์งธ ์ธ์ง์ num ์ ์ถ์ถํ  ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ง์ ํ๋ค.
1
2
3
4
from operator import add
rdd = sc.parallelize([("a", 2), ("b", 3), ("a", 3)])
sorted(rdd.reduceByKey(add).collect())
reduceByKey(add) ๋ RDD์ ๊ฐ ํค์ ๋ํด ๊ฐ์ ๋ํ๋ ์์
์ ์ํํ๋ค. ์
ํ๋ง ์  ๊ฐ ์์ปค ๋
ธ๋๋ ์์ ์ ํํฐ์
์์ ๋จผ์  ์ง๊ณ ์ฐ์ฐ์ ์ํํ๋ค. ์ด๋ ๊ฒ ๋ถ๋ถ์ ์ผ๋ก ์ง๊ณ๋ ๊ฒฐ๊ณผ๋ค์ ๋์ผํ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ์
ํ๋งํ๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ๋ถํ๋ฅผ ์ต์ํํ  ์ ์๋ค.
collect ๋ ๋ถ์ฐ๋ RDD์ ๋ชจ๋  ์์๋ฅผ ์์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ action ์ฐ์ฐ์ด๋ค.
๐ ์ฐธ๊ณ
https://wjrmffldrhrl.github.io/spark-1/



