SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
val conf = new SparkConf().setAppName("Test").setMaster("yarn")
conf.set("spark.executor.memory", "1g").set("spark.executor.cores", "1")
val sc = new SparkContext(conf)
설정 옵션
설정 |
기본값 |
비고 |
spark.driver.memory |
2g |
Driver가 사용할 메모리 |
spark.executor.memory |
5g |
Executor가 사용할 메모리 |
spark.executor.cores |
1 |
Application에 사용할 코어 개수 |
spark.driver.extraLibraryPath |
/opt/hadoop/lib/native |
Driver가 사용할 추가 라이브러리 |
spark.driver.extraJavaOptions |
-Djava.library.path=/opt/hadoop/lib/native |
Driver의 자바 옵션 |
spark.executor.extraLibraryPath |
/opt/hadoop/lib/native |
Executor가 사용할 추가 라이브러리 |
spark.executor.extraJavaOptions |
-Djava.library.path=/opt/hadoop/lib/native |
Executor의 자바 옵션 |
설정값은 spark-defaults.conf에 설정할 수 있다. |
// 설정값 확인
val config_value = "spark.master"
spark.conf.get(config_value)
// result : String = yarn
Executor
- 하나의 Executor는 하나의 YARN Container라고 볼 수 있고, Task는 하나의 Core라고 볼 수 있다.
- 하나의 Executor는 여러 개의 Task를 동시에 실행할 수 있다.
- 하나의 Executor에 Task가 너무 많으면 Context Swiching, HDFS I/O로 인해 성능이 떨어지고 너무 작으면 하나의 JVM을 공유하는 장점이 사라진다.
- 설정
spark-shell 설정 |
spark 설정 |
Default |
비고 |
--num-executors |
spark.executor.instances |
1 |
Executor 개수 |
--executor-memory |
spark.executor.memory |
512m |
Executor가 사용할 메모리 |
--executor-cores |
spark.executor.cores |
1 |
Application에 사용할 core 개수 |
|
spark.yarn.executor.memroyOverhead |
0.07 |
메모리 오버헤드 비율 |
|
spark.executor.extraJavaOptions |
JVM 옵션 |
|