Spark๋ฅผ ์ค๋ช ํ๊ธฐ ์ ์ ๋น ๋ฐ์ดํฐ ๊ธฐ์ ๊ณผ ํ๋ก์ ๊ดํด ์ค๋ช ํ๋ค.
๋น
๋ฐ์ดํฐ์ ์ ์ 1.
"์๋ฒ ํ ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ท๋ชจ์ ๋ฐ์ดํฐ" (๋ถ์ฐ ํ๊ฒฝ์ด ํ์ํ๋๋์ ํฌ์ปค์ค)
๋น
๋ฐ์ดํฐ์ ์ ์ 2.
"๊ธฐ์กด์ ์ํํธ์จ์ด(MySql๊ณผ ๊ฐ์ ๊ด๊ณํ DB)๋ก๋ ์ฒ๋ฆฌํ ์ ์๋ ๊ท๋ชจ์ ๋ฐ์ดํฐ"
๋ํ์ ์ธ ๊ธฐ์กด ์ํํธ์จ์ด ์ค๋ผํด์ด๋ MYSQL๊ณผ ๊ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
-๋ถ์ฐ ํ๊ฒฝ์ ์ผ๋์ ๋์ง ์์
๋น
๋ฐ์ดํฐ์ ์ ์ 3.
4V
Volume(๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๋์ฉ๋?),
Velocity(๋ฐ์ดํฐ์ ์ฒ๋ฆฌ ์๋๊ฐ ์ค์?)
Variety(๊ตฌ์กฐํ/๋น๊ตฌ์กฐํ ๋ฐ์ดํฐ ๋ ๋ค?)
Varecity(๋ฐ์ดํฐ์ ํ์ง์ด ์ข์์ง?)
๋์ฉ๋ ์ฒ๋ฆฌ๊ธฐ์ ์ด๋?
๋ถ์ฐํ๊ฒฝ ๊ธฐ๋ฐ(1๋ ํน์ ๊ทธ ์ด์์ ์๋ฒ๋ก ๊ตฌ์ฑ)
๋ถ์ฐ ์ปดํจํ
๊ณผ ๋ถ์ฐ ํ์ผ ์์คํ
์ด ํ์
Fault Tolerance
์์์ ์๋ฒ๊ฐ ๊ณ ์ฅ๋๋ ๋์ํด์ผํจ
ํ์ฅ์ด ์ฉ์ดํด์ผํจ
Scale Out์ด๋ผ๊ณ ๋ถ๋ฆ
Doug Cutting์ด ๊ตฌ๊ธ๋ฉ ๋ฐํ ๋ ผ๋ฌธ๋ค์ ๊ธฐ๋ฐํด ๋ง๋ ์คํ์์ค ํ๋ก์ ํธ
์ฒ์ ์์์ Nutch๋ผ๋ ์คํ์์ค ๊ฒ์์์ง์ ํ๋ถ ํ๋ก์ ํธ
2006๋
์ ์ํ์น ํฑ๋ ๋ฒจ ๋ณ๊ฐ ํ๋ก์ ํธ๋ก ๋จ์ด์ ธ ๋์ด
ํฌ๊ฒ ๋ ๊ฐ์ ์๋ธ ์์คํ
์ผ๋ก ๊ตฌ์ฑ
๋ถ์ฐ ํ์ผ ์์คํ
์ธ HDFS
๋ถ์ฐ ์ปดํจํ
์์คํ
์ธ MapReduce: ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํจ์จ์ ๊ทน๋ํํ๋๋ฐ ๋ง์ถค
MapReduce ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์
MapReduce ํ๋ก๊ทธ๋๋ฐ ์์
HDFS: ๋ถ์ฐ ํ์ผ ์์คํ
๋ถ์ฐ ์ปดํจํ ์์คํ
Spark์ ๋ฑ์ฅ
Spark vs. MapReduce
Spark์ ๊ตฌ์กฐ

Spark ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋
RDD(Resilient Distributed Dataset)
๋ก์ฐ๋ ๋ฒจ ํ๋ก๊ทธ๋๋ฐ API๋ก ใ
๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅ
ํ์ง๋ง ์ฝ๋ฉ ๋ณต์ก๋ ์ฆ๊ฐ
Dataframe & Dataset(ํ๋ค์ค์ ๋ฐ์ดํฐํ๋ ์๊ณผ ํก์ฌ
ํ์ด๋ ๋ฒจ ํ๋ก๊ทธ๋๋ฐ API๋ก ์ ์ ๋ง์ด ์ฌ์ฉ๋๋ ์ถ์ธ
SparkSQL์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฅผ ์ฐ๊ฒ ๋จ
๋ณดํต Scala, Java, Python ์ค์ ํ๋๋ฅผ ์ฌ์ฉ
ํ๋ค์ค์ ๋น๊ต
ํ๋ค์ค๋?
-ํ์ด์ฌ์ผ๋ก ๋ฐ์ดํฐ ๋ถ์์ ํ๋๋ฐ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ๋ชจ๋ ์ค์ ํ๋
-์๊ท๋ชจ์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ(ํ
์ด๋ธ ํํ์ ๋ฐ์ดํฐ)๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ต์
Spark ์ธ์
-Spark ํ๋ก๊ทธ๋จ์ ์์์ Spark ์ธ์
์ ๋ง๋๋ ๊ฒ
-Spark์ธ์
์ ํตํด Spark์ด ์ ๊ณตํด์ฃผ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉ
#RDD ๋ง๋๋ ์์
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark create RDD example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
sc = spark.sparkContext
#spark์ sc๋ฅผ ์ด์ฉํด ๋ค์์ ๋ฐฐ์ธ RDD์ ๋ฐ์ดํฐํ๋ ์์ ์กฐ์ํ๊ฒ ๋จ
ํฌ๊ฒ 3๊ฐ์ง์ ์๋ฃ๊ตฌ์กฐ๊ฐ ์กด์ฌํ๋ค.
RDD(Resilient Distributed Dataset)
๋ก์ฐ๋ ๋ฒจ ๋ฐ์ดํฐ๋ก ํด๋ฌ์คํฐ ๋ด์ ์๋ฒ์ ๋ถ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์นญ
๋ ์ฝ๋๋ณ๋ก ์กด์ฌํ๊ณ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ/๋น๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ๋ชจ๋ ์ง์
Dataframe๊ณผ Dataset
RDD์์ ๋ง๋ค์ด์ง๋ ํ์ด๋ ๋ฒจ ๋ฐ์ดํฐ๋ก RDD์๋ ๋ฌ๋ฆฌ ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง.
Dataset์ Dataframe๊ณผ๋ ๋ฌ๋ฆฌ ํ์
์ ๋ณด๊ฐ ์กด์ฌํ๋ฉฐ ์ปดํ์ผ ์ธ์ด(Scala/Java)์์ ์ฌ์ฉ ๊ฐ๋ฅ.
PySpark์์๋ Dataframe์ ์ฌ์ฉ(SparkSQL์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ผ๋ฐ์ )
๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ๋ถ์ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ
๋ค์์ ํํฐ์
์ผ๋ก ๊ตฌ์ฑ๋๊ณ Spark ํด๋ฌ์คํฐ ๋ด ์๋ฒ๋ค์ ๋๋ (cpu ์ ๋งํผ partition์ผ๋ก ๋๋์ด) ์ ์ฅ๋๋ค.
๋ก์ฐ๋ ๋ฒจ์ ํจ์ํ ๋ณํ(map, filter, flatMap ๋ฑ)์ ์ง์ํ๋ค.
RDD๊ฐ ์๋ ์ผ๋ฐ ํ์ด์ฌ ๋ฐ์ดํฐ๋ parallelize ํจ์๋ก RDD๋ก ๋ณํํด์ฃผ์ด์ผ ํ๋ค.

์์ฑ ๋ฐฉ๋ฒ
#postgresql์์ ํ
์ด๋ธ์ ์ฝ์ด Spark ํด๋ฌ์คํฐ ๋ด์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ง๋ค๊ธฐ
df = spark.read.format("jdbc") \
.option("url", "jdbc:postgresql://localhost:5432/databasename") \
.option("dbtable", "tablename") \
.option("user", "username") \
.option("password", "password") \
.option("driver", "org.postgresql.Driver") \
.load()
df.printSchema()
๊ฐ์ธ ์ปดํจํฐ์ ์ค์นํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ฐํธํ๊ธฐ๋ ํ์ง๋ง ๋
ธํธ๋ถ ๋ฑ์ ์ค์นํ๋ ค๋ฉด ๋ณต์กํด์ง๋ค. ์๋๋ฉด spark-submit์ ์ด์ฉํด ์คํ๊ฐ๋ฅํ๋ค.
๊ฐ์ข
๋ฌด๋ฃ ๋
ธํธ๋ถ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ตฌ๊ธ Colab์ ์ด์ฉํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ธ๋ฆญ์ ์ปค๋ฎค๋ํฐ ๋
ธํธ๋ถ์ ์ฌ์ฉํ๊ฑฐ๋, ์ ํ๋ฆฐ์ ๋ฌด๋ฃ ๋
ธํธ๋ถ์ ์ฌ์ฉํ ์ ์๋ค.
AWS์ EMR ํด๋ฌ์คํฐ ์ฌ์ฉ