[Spark] Spark Install Guide and Standalone mode start

Apache Spark Install Guide 

1. ์ŠคํŒŒํฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ ๊ตฌ์„ฑ์š”์†Œ 

1. Apache-Spark ๋‹ค์šด๋กœ๋“œ

http://spark.apache.org/downloads.html๋กœ ์ด๋™ํ•œ๋‹ค.

2. ๋‹ค์šด๋กœ๋“œ ๋ฒ„์ ผ ์„ค์ • 

์ŠคํŒŒํฌ ์ตœ์‹  ๋ฒ„์ ผ์„ ์„ ํƒํ–ˆ๋‹ค.

์‚ฌ์ „๋นŒ๋“œ(Pre-build)์ด๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ํ•˜๋‘ก ๋ฐฐํฌํŒ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ ๋‘๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์„ ํƒํ–ˆ๋‹ค.
ํ•„์š”ํ•œ๊ฒฝ์šฐ ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ ํ•ฉํ•œ ํ•˜๋‘ก ๋ฒ„์ ผ์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด ๋œ๋‹ค. 

# ์ฐธ๊ณ  : ํ•˜๋‘ก์€ ๋ฐ˜๋“œ์‹œ ์„ค์น˜ ๋˜์–ด ์žˆ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

3. ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ ์••์ถ• ํ’€๊ธฐ. 

txr -xvf spark-1.6.1-bin-without-hadoop.tgz
ln -s spark-1.6.1-bin-without-hadoop spark
vim ~/.bash_profile
export SPARK_HOME=/Users/KIDO/Documents/00.TOOLS/spark
export PATH=$JAVA_HOME:$MYSQL_HOME:$ACTIVATOR_HOME:$SPARK_HOME/bin:$PATH
์ƒ๊ธฐ ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•˜๊ณ  :wq๋กœ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

source .bash_profile

4. ์ŠคํŒŒํฌ ๋””๋ ‰ํ† ๋ฆฌ ๋‘˜๋Ÿฌ๋ณด๊ธฐ


bin
  - ์‹คํ–‰ ๋ช…๋ น์ด ๋“ค์–ด์žˆ๋‹ค.
conf
  - ์ŠคํŒŒํฌ ์„ค์ •์„ ์œ„ํ•œ ์„ค์ •ํŒŒ์ผ
  - ์ŠคํŒŒํฌ ํ™˜๊ฒฝ์„ค์ •, log์„ค์ •, docker๊ด€๋ จ ์„ค์ •, slave๊ด€๋ จ ์„ค์ •๋“ฑ ๋‹ค์–‘ํ•˜๋‹ค.
examples
  - ์ŠคํŒŒํฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
lib
  - ์ŠคํŒŒํฌ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์กด์žฌํ•œ๋‹ค.
  - spark-yarn ์…”ํ”Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ•˜๋‘ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ฑ์ด ์žˆ๋‹ค.
python
  - ํŒŒ์ด์„  ์ŠคํŒŒํฌ๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋‹ค.
R
  - spark R์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
sbin
  - ์ŠคํŒŒํฌ ๋งˆ์Šคํ„ฐ์„œ๋ฒ„ ๋ฐ ์Šฌ๋ ˆ์ด๋ธŒ ์„œ๋ฒ„ ์‹คํ–‰ ๋ช…๋ น

2. Spark Standalone Mode 

์ถœ์ฒ˜ : http://spark.apache.org/docs/latest/spark-standalone.html

์ŠคํŒŒํฌ๋Š” Mesosํ˜น์€ YARN ์ƒ์—์„œ ์ˆ˜ํ–‰์ด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Standalone๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
์Šคํƒ ๋“œ ์–ผ๋ก  ๋ชจ๋“œ๋Š” ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋งˆ์Šคํ„ฐ์™€ ์›Œ์ปค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•œ๋‹ค.

1. ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๋™ ์‹คํ–‰ 

1.1 ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ
./sbin/start-master.sh
๋งˆ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ŠคํŒŒํฌ๋Š” ://HOST:PORT์˜ ํ˜•์‹์œผ๋กœ URL์„ ํ”„๋ฆฐํŠธํ•œ๋‹ค.
์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ SparkContext๋กœ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ๋งˆ์Šคํ„ฐ์˜ WEB-UI๋Š” http://localhost:8080์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

1.2 ์Šฌ๋ ˆ์ด๋ธŒ ์›Œ์ปค ์‹คํ–‰ํ•˜๊ธฐ.
./sbin/start-slave.sh <master-spark-URL>
์Šฌ๋ ˆ์ด๋ธŒ ์›Œ์ปค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด master WEB-UI์—์„œ ์‹ ๊ทœ ๋…ธ๋“œ๊ฐ€ ์ ‘์†๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด๋“ฑ์„ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

1.3 ๋งˆ์Šคํ„ฐ์™€ ์Šฌ๋ ˆ์ด๋ธŒ ์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ
ArgumentMeaning
-h HOST--host HOST๋ฆฌ์Šจํ•  ํ˜ธ์ŠคํŠธ๋ช…์„ ์„ค์ •ํ•œ๋‹ค.
-i HOST--ip HOST๋ฆฌ์Šจํ•  ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค. (deprecated๋จ, -h๋‚˜ --host์ด์šฉ)
-p PORT--port PORT๋ฆฌ์Šจํ•  ์„œ๋น„์Šค์˜ ํฌํŠธ๋ฒˆํ˜ธ (๊ธฐ๋ณธ : 7077 ๋งˆ์Šคํ„ฐ, worker์€ ๋žœ๋ค)
--webui-port PORTweb UI๋ฅผ ์œ„ํ•œ ํฌํŠธ (๊ธฐ๋ณธ ๋งˆ์Šคํ„ฐ : 8080, ์›Œ์ปค : 8081)
-c CORES--cores CORES์ŠคํŒŒํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•  CPU์ฝ”์–ด์˜ ์ด ๊ฐœ์ˆ˜,
๋จธ์‹ ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋  ์ˆ˜ ์žˆ๋‹ค. (๊ธฐ๋ณธ : all available)
์ด๊ฒƒ์€ worker์—๋งŒ ์„ค์ •ํ•œ๋‹ค. 
-m MEM--memory MEM์ŠคํŒŒํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•  ์ด ๋ฉ”๋ชจ๋ฆฌ ์–‘,
๋จธ์‹ ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋  ์ˆ˜ ์žˆ๋‹ค. (๊ธฐ๋ณธ : ๋จธ์‹  ์ด RAM - 1GB)
ํ˜•์‹ : 1000M ํ˜น์€ 2G ๋“ฑ์œผ๋กœ ์„ค์ •
์ด๊ฒƒ์€ worker์—๋งŒ ์„ค์ •ํ•œ๋‹ค. 
-d DIR--work-dir DIR์ž‘์—…์— ์‚ฌ์šฉํ•  ๊ณต๊ฐ„๊ณผ job๊ฐ€ ์ถœ๋ ฅํ•  ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ
(๊ธฐ๋ณธ : SPARK_HOME/work)์ด๋ฉฐ worker์—๋งŒ ์„ค์ •ํ•œ๋‹ค. 
--properties-file FILE๋กœ๋“œํ•  ์ปค์Šคํ…€ Spark ํ”„๋กœํผํ‹ฐ ํŒจ์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค.
(๊ธฐ๋ณธ : conf/spark-defaults.conf)

2. ํด๋Ÿฌ์Šคํ„ฐ ๋Ÿฐ์น˜ ์Šคํฌ๋ฆฝํŠธ 

์ŠคํŒŒํฌ๋ฅผ ์Šคํƒ ๋“œ ์–ผ๋ก  ๋ชจ๋“œ๋กœ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, conf/slave ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด๋Š” spark๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์— ์กด์žฌํ•œ๋‹ค.
์ด ํŒŒ์ผ์—๋Š” ์ŠคํŒŒํฌ ์›Œ์ปค๊ฐ€ ์‹คํ–‰ํ•  ๋ชจ๋“  ๋จธ์‹ ์˜ ํ˜ธ์ŠคํŠธ ๋ช…์ด ๊ธฐ์ˆ  ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋งŒ์•ฝ conf/slave๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด  lunch script๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ผ ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค. (localhost)
์ด๋Š” ํ…Œ์ŠคํŒ…์„ ์œ„ํ•ด์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
๋งˆ์Šคํ„ฐ ๋จธ์‹ ์€ ๊ฐ ์›Œ์ปค ๋จธ์‹ ์— ssh๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ssh๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด password์—†์ด ์„œ๋ฒ„๊ฐ„ access๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋งŒ์•ฝ password-less์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด SPARK_SSH_FOREGROUND ๋ณ€์ˆ˜๊ฐ’์— ๊ฐ ์›Œ์ปค๋ฅผ ์œ„ํ•œ password๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ค์ •์„ ์™„๋ฃŒํ•˜๊ณ  ๋‚˜๋ฉด launch๋‚˜ stop๋ฅผ ๋‹ค์Œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์‰˜๋“ค์€ SPARK_HOME/sbin์— ๋“ค์–ด์žˆ๋‹ค.
  • sbin/start-master.sh - ๋งˆ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 
  • sbin/start-slaves.sh - conf/slaves ํŒŒ์ผ์— ์ง€์ •๋œ ๋จธ์‹ ์— ์Šฌ๋ ˆ์ด๋ธŒ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 
  • sbin/start-slave.sh - ๋จธ์‹ ๋‚ด์— ์Šฌ๋ ˆ์ด๋ธŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 
  • sbin/start-all.sh - ์ƒ๋‹จ์— ๊ธฐ์ˆ ํ•œ ๋ชจ๋“  ๋งˆ์Šคํ„ฐ์™€ ์Šฌ๋ ˆ์ด๋ธŒ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 
  • sbin/stop-master.sh - bin/start-master.sh์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•œ ๋งˆ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค. 
  • sbin/stop-slaves.sh - conf/slavesํŒŒ์ผ์— ์ง€์ •๋œ ๋จธ์‹ ์—์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค. 
  • sbin/stop-all.sh - ๋งˆ์Šคํ„ฐ์™€ ์Šฌ๋ ˆ์ด๋ธŒ ๋ชจ๋‘ ์ข…๋ฃŒํ•œ๋‹ค. 
์ฃผ์˜ํ•  ๊ฒƒ์€ ์ƒ๊ธฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค. ์Šฌ๋ ˆ์ด๋ธŒ ๋…ธ๋“œ์—์„œ ๊ฐ๊ฐ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ค์ •์€ conf/spark-env.sh์— ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์„ ํƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ํŒŒ์ผ์€ conf/spark-env.sh.template๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ชจ๋“  ์›Œ์ปค ๋จธ์‹ ์— ์„ค์ •๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ชฉ๋ก : 
Environment VariableMeaning
SPARK_MASTER_IPํŠน์ • IP์ฃผ์†Œ์— ๋งˆ์Šคํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. 
SPARK_MASTER_PORT๋‹ค๋ฅธ ํฌํŠธ๋กœ ๋งˆ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (๊ธฐ๋ณธ : 7077)
SPARK_MASTER_WEBUI_PORT๋งˆ์Šคํ„ฐ web UI์šฉ ํฌํŠธ (๊ธฐ๋ณธ:8080)
SPARK_MASTER_OPTS๋งˆ์Šคํ„ฐ์— ์„ค์ •๋  ์˜ต์…˜๋“ค์„ ์„ค์ •ํ•œ๋‹ค.
ํ˜•์‹ : "-Dx=y" ์˜ ํ˜•์‹์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
์•„๋ž˜ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ์ฐธ์กฐ. 
SPARK_LOCAL_DIRS์ŠคํŒŒํฌ๊ฐ€ ์‚ฌ์šฉํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด๊ฒƒ์€ map ์ถœ๋ ฅํŒŒ์ผ, RDD ๋“ฑ์„ ์ €์žฅํ•œ๋‹ค. ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ ๋‚ด์˜ ๋กœ์ปฌ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. ์ฝค๋งˆ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋กœ๋‹ค๋ฅธ ๋””์Šคํฌ์ƒ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค. 
SPARK_WORKER_CORES์ŠคํŒŒํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋จธ์‹ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ด ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’ : all avaliable cores)
SPARK_WORKER_MEMORY์ŠคํŒŒํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋จธ์‹ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ด ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์„ ์ง€์ •ํ•œ๋‹ค.
ํ˜•์‹ : 1000m, 2G (๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ฉ”๋ชจ๋ฆฌ - 1G๋ฅผ ์„ค์ •ํ•œ๋‹ค.)
๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์˜ ๊ฐœ๋ณ„์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •์€ spark.executor.memoryproperty๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 
SPARK_WORKER_PORTํŠน์ • ํฌํŠธ๋กœ ์ŠคํŒŒํฌ ์›Œ์ปค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’ : random)
SPARK_WORKER_WEBUI_PORT์›Œ์ปค์˜ web UI๋ฅผ ์ˆ˜ํ–‰ํ•  ํฌํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’ : 8081)
SPARK_WORKER_INSTANCES๊ฐ ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰ํ•  ์›Œ์ปค ์ธ์Šคํ„ด์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. (๊ธฐ๋ณธ : 1)
1 ์ด์ƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งค์šฐ ํฐ ๋จธ์‹ ์—์„œ ์ด์šฉํ•˜๊ฑฐ๋‚˜, ๋ณต์ˆ˜๊ฐœ์˜ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‘๊ณ ์ž ํ• ๋•Œ ์ด ๊ฐ’์„ ์ฆ๊ฐ€ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๊ฒฝ์šฐ์—๋Š” SPARK_WORKER_CORES ๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ ์›Œ์ปค์˜ ์›Œ์ปค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํ˜น์€ ๊ฐ ์›Œ์ปค๋Š” ๋ชจ๋“  ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
SPARK_WORKER_DIR์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์„ ์ˆ˜ํ–‰ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด๊ณณ์—๋Š” ๋กœ๊ทธ์™€ ์›Œ์ปค ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ด์šฉ๋œ๋‹ค. (๊ธฐ๋ณธ : SPARK_HOME/work)
SPARK_WORKER_OPTS์›Œ์ปค์— ๋Œ€ํ•œ ์„ค์ •๊ฐ’์„ ์ง€์ •ํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
ํ˜•์‹ : "-Dx=y"
์•„๋ž˜ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์ž. 
SPARK_DAEMON_MEMORY์ŠคํŒŒํฌ ๋งˆ์Šคํ„ฐ์™€ ์›Œ์ปค ๋ฐ๋ชฌ ์ž์ฒด์— ํ• ๋‹นํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค. (๊ธฐ๋ณธ : 1g)
SPARK_DAEMON_JAVA_OPTSJVM์˜ต์…˜์œผ๋กœ ์ŠคํŒŒํฌ ๋งˆ์Šคํ„ฐ์™€ ์›Œ์ปค ๋ฐ๋ชฌ ์ž์ฒด์— ์„ค์ •ํ•˜๋Š” ์˜ต์…˜๊ฐ’์ด๋‹ค.
ํ˜•์‹ : "-Dx=y"์˜ ํ˜•ํƒœ์ด๋‹ค. 
SPARK_PUBLIC_DNSpublic DNS๋ช…์„ ์ง€์ •ํ•œ๋‹ค. 
* ์ฐธ๊ณ  : launch script๋Š” window์—์„œ๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆ˜๋™์œผ๋กœ ์ง์ ‘ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

SPARK_MASTER_OPTS ์˜ต์…˜ : 
Property NameDefaultMeaning
spark.deploy.retainedApplications200๋””์Šคํ”Œ๋ ˆ์ดํ•  ์™„๋ฃŒ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜ค๋ž˜๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ UI์—์„œ ์ด ์ œํ•œ์— ๊ฑธ๋ ค ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. 
spark.deploy.retainedDrivers200๋””์Šคํ”„๋ ˆ์ดํ•  ์™„๋ฃŒ๋œ ๋“œ๋ผ์ด๋ฒ„๋“ค์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜ค๋ž˜๋œ ๋“œ๋ผ์ด๋ฒ„๋Š” UI์—์„œ ์ด ์ œํ•œ์— ๊ฑธ๋ ค ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. 
spark.deploy.spreadOuttrue์Šคํƒ ๋“œ ์–ผ๋ก  ํด๋Ÿฌ์Šคํ„ฐ ๋งค๋‹ˆ์ €๋Š” ๋…ธ๋“œ๋“ค๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ถ„์‚ฐํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์•„๋‹ˆ๋ฉด ๊ฐ€๋Šฅํ•˜๋ฉด ๋ช‡๊ฐœ์˜ ๋…ธ๋“œ๋“ค๋กœ ํ†ตํ•ฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋ถ„์‚ฐ ํ•˜๋Š” ์ž‘์—…์€ ๋ณดํ†ต HDFS์—์„œ ๋” ๋‚ณ์€ ๋ฐ์ดํ„ฐ ๋กœ์ปฌ๋ฆฌํ‹ฐ๋ฅผ ์œ„ํ•ด ์ด์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ†ตํ•ฉ ์ž‘์—…์€ ๊ณ„์‚ฐ์— ๋” ์ง‘์ค‘์ ์ธ ์ž‘์—…์„ ์œ„ํ•ด์„œ ํšจ๊ณผ์ ์ด๋‹ค. 
spark.deploy.defaultCores(infinite)๋งŒ์•ฝ spark.cores.max๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€๊ฒฝ์šฐ๋ผ๊ณ  ํ•˜๋ฉด ์ŠคํŒŒํฌ ์Šคํƒ ๋“œ ์–ผ๋ก ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ• ๋‹นํ•  ๊ธฐ๋ณธ ์ฝ”์–ด์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ญ์ƒ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ฝ”์–ด๋ฅผ spark.cores.max์— ํ• ๋‹นํ•œ๋‹ค. ๊ณต์œ ๋œ ํด๋Ÿฌ์Šค์— ์ด ๊ฐ’์„ ๋‚ฎ๊ฒŒ ์ง€์ •ํ•˜์—ฌ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์žก์•„๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
spark.worker.timeout60๋งŒ์•ฝ ๋งˆ์Šคํ„ฐ๊ฐ€ ํ—ˆํŠธ๋น„ํŠธ๋ฅผ ์ˆ˜ํžŒํ•˜์ง€ ๋ชปํ•œ๊ฒฝ์šฐ ์–ผ๋งˆ์˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์›Œ์ปค๊ฐ€ ์œ ์‹ค ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ์‹œ๊ฐ„์ด๋‹ค. (์ดˆ๋‹จ์œ„)
SPARK_WORKER_OPTS ์˜ต์…˜ : 
Property NameDefaultMeaning
spark.worker.cleanup.enabledfalseworker์˜ /application ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํด๋ฆฐ์—… ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์˜ค์ง standalone๋ชจ๋“œ์—์„œ๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ์„ค์ •๊ฐ’์ด๋‹ค. WARN์€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์˜ค์ง ์ •์ง€๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋งŒ์„ ํด๋ฆฐ์—… ํ•˜๊ฒŒ ๋œ๋‹ค. 
spark.worker.cleanup.interval1800 (30 minutes)๋กœ์ปฌ๋จธ์‹ ์—์„œ ์˜ค๋ž˜๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์—…์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํด๋ฆฐ์—… ํ•  ์ธํ„ฐ๋ฒŒ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ดˆ๋‹จ์œ„์ด๋‹ค. 
spark.worker.cleanup.appDataTtl7 * 24 * 3600 (7 days)๊ฐ ์›Œ์ปค์—์„œ ์œ ์ง€ํ•ด์•ผํ•  ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์˜ TTL์„ ์ง€์ •ํ•œ๋‹ค. ์ดˆ๋‹จ์œ„์ด๋ฉฐ ์ด๊ฒƒ์€ Time To Live์ด๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๋””์Šคํฌ์˜ ์šฉ๋Ÿ‰์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ์™€ jars๋“ค์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์›Œํฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œ ๋œ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด work dirs๋“ค์€ ๋น ๋ฅด๊ฒŒ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ด ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ํŠนํžˆ job๋“ค์„ ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๋ฉด ๋ง์ด๋‹ค. 

3. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Cluster๋กœ ์ปค๋„ฅํŒ… ํ•˜๊ธฐ

์ŠคํŒŒํฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ spark://IP:PORT ๋ฅผ SparkContext constructor์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ŠคํŒŒํฌ ์‰˜์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ ์ธํ„ฐ๋ ‰์…˜ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์ปค๋งจ๋“œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

./bin/spark-shell --master spark://IP:PORT
๋˜ํ•œ ์˜ต์…˜์„ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ --total-executor-cores <numCores> ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ŠคํŒŒํฌ ์‰˜์ด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉํ•  ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Spark Application๋“ค ๋Ÿฐ์นญํ•˜๊ธฐ. 

spark-submit ์Šคํฌ๋ฆฝํŠธ๋Š” ์ง๊ด€์ ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ์ŠคํŒŒํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์„œ๋ฐ‹ ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
standalone ํด๋Ÿฌ์Šคํ„ฐ๋“ค์—์„œ๋Š” ํ˜„์žฌ ์ œ๊ณต๋˜๋Š” 2๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค. client๋ชจ๋“œ์—์„œ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋Ÿฐ์น˜ ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฐ‹์ด ๋œ๋‹ค. cluster๋ชจ๋“œ์—์„œ ๋“œ๋ผ์ด๋ฒ„๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋‚ด์˜ ํ•˜๋‚˜์˜ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋“ค์˜ ํ•˜๋‚˜๋กœ ๋ถ€ํ„ฐ ๋Ÿฐ์น˜๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ”๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋ฐ‹ ์ž‘์—…์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๊ธฐ ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰๋œ๋‹ค.

๋งŒ์•ฝ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Spark ์„œ๋ฐ‹์„ ํ†ตํ•ด์„œ ๋Ÿฐ์น˜๋˜๋ฉฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ jar๋Š” ์ž๋™์ ์œผ๋กœ ๋ชจ๋“  ์›Œ์ปค ๋…ธ๋“œ๋กœ ๋ฐฐํฌ๋œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜์กด๋œ ๋‹ค๋ฅธ jar๋“ค์€ --jars์˜ต์…˜์— ์ฝค๋งˆ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ (ex --jars jar1,jar2) ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ • ํ˜น์€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ปจํŠธ๋กค ํ•˜๋Š” ๊ฒƒ์€ Spark Configuration์„ ์ฐธ์กฐํ•˜์ž.

์ถ”๊ฐ€์ ์œผ๋กœ ์Šคํƒ ๋“œ ์–ผ๋ก  ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋Š” 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ข…๋ฃŒ ๋˜์—ˆ์„๋•Œ ์ž๋™์œผ๋กœ ์žฌ ์‹œ์ž‘ ํ•˜๋Š” ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” --superviseํ”Œ๋ž˜์Šค์—์„œ spark-submit๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋˜๋ฉฐ, ์ด๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์‹œ์— ์ „๋‹ฌ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ์‹คํŒจ๋•Œ๋ฌธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

./bin/spark-class org.apache.spark.deploy.client kill <master url> <driver ID>
๋“œ๋ผ์ด๋ฒ„ ์•„์ด๋””๋Š” http://<master url>:8080์—์„œ web UI๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์•„์ด๋””๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

5. Resource Scheduling 

standalone ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ์—์„œ๋Š” ํ˜„์žฌ ๋‹จ์ˆœ FIFO ์Šค์ผ€์ค„๋Ÿฌ๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ณต์ˆ˜์˜ ๋™์‹œ ์ด์šฉ์ž๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด ์‚ฌ์šฉํ•  ์ตœ๋Œ€ ๋ฆฌ์†Œ์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  ์ฝ”์–ด๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋˜์ง€๋งŒ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ์„ ์‹คํ–‰ํ• ๋•Œ์—๋งŒ ์œ ํšจํ•˜๋‹ค. ์ด ์„ค์ •์€ spark.cores.max ๋ฅผ SparkConf๋‚ด์—์„œ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ œ )
val conf = new SparkConf()
            .setMaster(...)
            .setAppName(...)
            .set("spark.cores.max", "10")
val sc = new SparkContext(conf)
์ถ”๊ฐ€์ ์œผ๋กœ spark.deploy.defaultCores๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ์„ค์ •์€ conf/spark-env.sh์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
์ด๊ฒƒ์€ ๊ณต์œ  ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์—์„œ ์œ ์šฉํ•˜๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์ตœ๋Œ€์ˆ˜์˜ cores๋ฅผ ์ง€์ •ํ•˜์ง€๋Š” ์•Š์„๋•Œ ๋ง์ด๋‹ค.

6. Monitoring and Logging

Spark ์Šคํƒ ๋“œ์–ผ๋ก  ๋ชจ๋“œ๋Š” ์›น ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋งˆ์Šคํ„ฐ์™€ ๊ฐ ์›Œ์ปค๋“ค์€ ๊ฐ์ž์˜ web UI๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์™€ ์žก๋“ค์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น UI์— 8080์„ ํ†ตํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํฌํŠธ๋Š” ์„ค์ • ํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ˆ˜ํ–‰์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐ ์žก์˜ ์ƒ์„ธ ๋กœ๊ทธ๋Š” ๊ฐ ์Šฌ๋ ˆ์ด๋ธŒ ๋…ธ๋“œ์˜ ์›Œํฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ SPARK_HOME/work๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ๋˜ํ•œ ์žก๋“ค์— ๋Œ€ํ•ด์„œ 2๊ฐœ์˜ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ stdout๊ณผ stderr๋กœ ์ €์žฅ์ด ๋œ๋‹ค.

7. Running Alongside Hadoop

์กด์žฌํ•˜๋Š” ํ•˜๋‘ก์„ ์ด์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ˆœํžˆ ๋™์ผํ•œ ๋จธ์‹ ์—์„œ ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค๋กœ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. Hadoop ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŒŒํฌ์—์„œ ์—‘์„ธ์Šค ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” hdfs://URL (๋ณดํ†ต : hdfs://<namenode>:9000/path ์ด๋‹ค. ) ๋ฐ˜๋Œ€๋กœ ์™„์ ผ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ํ•˜๋‘ก๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ์—๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด์„œ ์ ‘์†ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋กœ์ปฌ ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค์— ๋น„ํ•ด์„œ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง„๋‹ค.

8. Configuring Ports for Network Security

 ์ŠคํŒŒํฌ๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋งŽ์ด ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค. ๋˜ํ•œ ์–ด๋– ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŒŒ์ด์–ด์›” ์„ค์ •์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ œํ•œ๋œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๊ฐ€์ž. http://spark.apache.org/docs/latest/security.html#configuring-ports-for-network-security


9. High Availability

๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํƒ ๋“œ์–ผ๋ก  ์Šค์ผ€์ค„๋ง ํด๋Ÿฌ์Šคํ„ฐ๋Š” Worker์˜ ์‹คํŒจ๋“ค์— ๋Œ€ํ•ด์„œ ํšŒ๋ณต๋ ฅ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” Master๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋‹จ์ผ ์‹คํŒจ์ง€์  (SPOF)๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ๋งˆ์Šคํ„ฐ๊ฐ€ ํฌ๋ž˜์‰ฌ๋˜๋ฉด, ์–ด๋– ํ•œ ์ƒˆ๋กœ์šด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์ดใ…œํ•ด์„œ 2๊ฐœ์˜ high availability ์Šคํ‚ค๋งˆ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•œ๋‹ค.

10. Standby Masters with ZooKeeper

Overview
zookeeper์˜ ์ฃผ ์šฉ๋„๋Š” ๋ฆฌ๋”์˜ ์„ ์ถœ๊ณผ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ณต์ˆ˜๊ฐœ์˜ ๋งˆ์Šคํ„ฐ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์ •ํ•˜์—ฌ ๋™์ผํ•œ ZooKeeper์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋Œ€๋Š” "leader"๋กœ ์„ ์ถœ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” standby mode๋กœ ๋งˆ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ leader๊ฐ€ ์ฃฝ์œผ๋ฉด, ๋‹ค๋ฅธ๊ฒƒ์ด Master๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๊ฒŒ ๋˜๊ณ  ๋™์ผํ•œ ์Šค์ผ€์ค„๋ง์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
์ „์ฒด ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋งˆ๋„ ์ฒ˜์Œ ๋งˆ์Šคํ„ฐ๊ฐ€ ์ฃฝ๊ณ  ๋‚˜์„œ ๋ถ€ํ„ฐ ์•ฝ 1 ~ 2๋ถ„ ์ •๋„ ์†Œ์š”๋œ๋‹ค.
์ด ๋”œ๋ ˆ์ด๋Š” ์ƒˆ๋กœ์šด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ค„๋ง์—๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ๋งˆ์Šคํ„ฐ failover๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

Zookeeper์— ๋Œ€ํ•ด์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ณด๋ ค๋ฉด http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html ์„ ์ฐธ์กฐํ•˜์ž.

Configuration
์ŠคํŒŒํฌ ๋ณต๊ตฌ ๋ชจ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด spark-env์Šคํฌ๋ฆฝํŠธ ๋‚ด์— SPARK_DAEMON_JAVA_OPTS ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
System propertyMeaning
spark.deploy.recoveryModezookeeper๋ฅผ standby ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. (๊ธฐ๋ณธ : NONE)
spark.deploy.zookeeper.urlZooKeeper ํด๋Ÿฌ์Šคํ„ฐ url์„ ์„ค์ •ํ•œ๋‹ค.
์˜ˆ) 192.168.1.100:2181,168.1.101:2181
spark.deploy.zookeeper.dirThe directory in ZooKeeper to store recovery state (default: /spark).
๋ฉ€ํ‹ฐํ”Œ ๋งˆ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋งˆ์Šคํ„ฐ๊ฐ€ ์ฃผํ‚คํผ๋ฅผ ์ด์šฉํ•˜๋Š” ์„ค์ •์— ์‹คํŒจ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋งˆ์Šคํ„ฐ๋Š” ์„œ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ์ž‘์—…์— ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ชจ๋“  ๋งˆ์Šคํ„ฐ๋“ค์ด ๋ฆฌ๋”๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค. (๋ชจ๋“  ๋งˆ์Šคํ„ฐ๋“ค์€ ๋…๋ฆฝ์ ์œผ๋กœ ์Šค์ผ€์ค„๋ง ํ•˜๊ฒŒ ๋œ๋‹ค.)

Details
์ฃผํ‚คํผ ์„ค์ •์„ ์™„๋ฃŒํ•˜๊ณ  ๋‚˜๋ฉด high availability๋ฅผ ๊ธฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ณต์ˆ˜๊ฐœ์˜ ๋งˆ์Šคํ„ฐ๋ฅผ ์„œ๋กœ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๋™์ผํ•œ ์ฃผํ‚คํผ ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค. (ZooKeeper URL๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •). ๋งˆ์Šคํ„ฐ๋“ค์„ ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€๋‚˜ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ƒˆ๋กœ์šด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์Šค์ผ€์ค„ ํ•˜๊ฑฐ๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ์— worker๋ฅผ ์ถ”๊ฐ€ํ• ๋•Œ์—๋Š” ํ˜„์žฌ Master์˜ IP๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋งˆ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์—๋‹ค๊ฐ€ ์ „๋‹ฌ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SparkContext๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งˆ์Šคํ„ฐ์˜ ์œ„์น˜๋ฅผ ํฌ์ธํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. spark://host1:port1,host2:port2 ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด SparkContext๋Š” ๋‘๊ฐœ์˜ ๋งˆ์Šคํ„ฐ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•œ๋‹ค. host1์ด ๋‚ด๋ ค๊ฐ€ ์žˆ์œผ๋ฉด ์ด ์„ค์ •์€ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์ฐพ์„ ๊ฒƒ์ด๋ฉฐ ์ด๊ฒƒ์ด host2๊ฐ€ ๋จ์„ ์•Œ๋ ค ์ค„ ๊ฒƒ์ด๋‹ค.

"registering with a Master"๊ณผ normal operation์‚ฌ์ด์—๋Š” ์ค‘์š”ํ•œ ๊ตฌ๋ณ„ ๋˜๋Š” ์ ์ด ์žˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์›Œ์ปค๊ฐ€ ์‹คํ–‰๋ ๋•Œ ํ˜„์žฌ์˜ ๋งˆ์Šคํ„ฐ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ์ด ์ž‘์—…์ด ํ•œ๋ฒˆ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ๋‚˜๋ฉด ์ด ๋‚ด์šฉ์„ Zookeeper์— ์ €์žฅํ•œ๋‹ค. ๋งŒ์•ฝ failover๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฆฌ๋”๊ฐ€ ๋ชจ๋“  ๋“ฑ๋ก๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค๊ณผ Workers์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋ฉฐ, ์ดํ›„ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—๊ฒŒ ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์•Œ๋ฆฐ๋‹ค.

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

11. Single-Node Recovery with Local File System

Overview
์ฃผํ‚คํผ๋Š” high availability๋ฅผ ์œ„ํ•œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋‹ค์šด๋˜์—ˆ์„๋•Œ ๋‹จ์ง€ ๋ฆฌ์Šคํƒ€ํŠธ๋ฅผ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ๋‹ค. FILESYSTEM๋ชจ๋“œ๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์›Œ์ปค๊ฐ€ ๋“ฑ๋ก๋ ๋•Œ ์ œ๊ณต๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๊ฒƒ์€ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฆฌ์Šคํƒ€ํŠธ ๋ ๋•Œ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Configuration
๋ณต๊ตฌ ๋ชจ๋“œ๋ฅผ ๊ธฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” spark-env ์„ค์ •ํŒŒ์ผ์˜ SPARK_DAEMON_JAVA_OPTS์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
System propertyMeaning
spark.deploy.recoveryModeFILESYSTEM์„ ์„ค์ •ํ•˜์—ฌ ๋‹จ์ผ ๋…ธ๋“œ ๋ณต๊ตฌ ๋ชจ๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ ์ง€์ •ํ•œ๋‹ค.
(๊ธฐ๋ณธ :  ใ…œNONE)
spark.deploy.recoveryDirectorySpark๊ฐ€ ๋ณต๊ตฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผํ• ์ˆ˜์žˆ๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค. 
Detail 
  • This solution can be used in tandem with a process monitor/manager like monit, or just to enable manual recovery via restart.
  • While filesystem recovery seems straightforwardly better than not doing any recovery at all, this mode may be suboptimal for certain development or experimental purposes. In particular, killing a master via stop-master.sh does not clean up its recovery state, so whenever you start a new Master, it will enter recovery mode. This could increase the startup time by up to 1 minute if it needs to wait for all previously-registered Workers/clients to timeout.
  • While it’s not officially supported, you could mount an NFS directory as the recovery directory. If the original Master node dies completely, you could then start a Master on a different node, which would correctly recover all previously registered Workers/applications (equivalent to ZooKeeper recovery). Future applications will have to be able to find the new Master, however, in order to register.






Share this

Related Posts

Previous
Next Post »

1 ๊ฐœ์˜ ๋Œ“๊ธ€:

Write ๊ฐœ์˜ ๋Œ“๊ธ€
2016๋…„ 11์›” 17์ผ ์˜คํ›„ 11:18 delete

์„ค๋ช…ํ•ด์ฃผ์‹ ๋Œ€๋กœ ๋”ฐ๋ผํ–ˆ๋Š”๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๋™ ์‹คํ–‰ ์‹œ
์•„๋ž˜์™€ ๊ฐ™์ด noClassDefFound ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
ํ˜น์‹œ ๋™์ผ์ฆ์ƒ ์—†์œผ์…จ๋‚˜์š”?

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Reply
avatar