Spark提供三个位置用来配置系统:
Spark properties控制大部分的应用程序参数,可以用SparkConf对象或者java系统属性设置
Environment variables可以通过每个节点的conf/spark-env.sh脚本设置每台机器的设置。例如IP地址
Logging可以通过log4j.properties配置
Spark属性
Spark属性控制大部分的应用程序设置,并且为每个应用程序分别配置它。这些属性可以直接在SparkConf上配置,然后传递给SparkContext
。SparkConf
允许你配置一些通用的属性(如master URL、应用程序明)以及通过set()
方法设置的任意键值对。例如,我们可以用如下方式创建一个拥有两个线程的应用程序。注意,我们用local[2]
运行,这意味着两个线程-表示最小的 并行度,它可以帮助我们检测当在分布式环境下运行的时才出现的错误。
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("CountingSheep")
.set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)
注意,我们在本地模式中拥有超过1个线程。和Spark Streaming的情况一样,我们可能需要一个线程防止任何形式的饥饿问题。
动态加载Spark属性
在一些情况下,你可能想在SparkConf
中避免硬编码确定的配置。例如,你想用不同的master或者不同的内存数运行相同的应用程序。Spark允许你简单地创建一个空conf。
val sc = new SparkContext(new SparkConf())
然后你在运行时提供值。
./bin/spark-submit --name "My app" --master local[4] --conf spark.shuffle.spill=false
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar
Spark shell和spark-submit
工具支持两种方式动态加载配置。第一种方式是命令行选项,例如--master
,如上面shell显示的那样。spark-submit
可以接受任何Spark属性,用--conf
标记表示。但是那些参与Spark应用程序启动的属性要用特定的标记表示。运行./bin/spark-submit --help
将会显示选项的整个列表。
bin/spark-submit
也会从conf/spark-defaults.conf
中读取配置选项,这个配置文件中,每一行都包含一对以空格分开的键和值。例如:
spark.master spark://5.6.7.8:7077
spark.executor.memory 512m
spark.eventLog.enabled true
spark.serializer org.apache.spark.serializer.KryoSerializer
任何标签(flags)指定的值或者在配置文件中的值将会传递给应用程序,并且通过SparkConf
合并这些值。在SparkConf
上设置的属性具有最高的优先级,其次是传递给spark-submit
或者spark-shell
的属性值,最后是spark-defaults.conf
文件中的属性值。
查看Spark属性
在http://:4040
上的应用程序Web UI在“Environment”标签中列出了所有的Spark属性。这对你确保设置的属性的正确性是很有用的。注意,只有通过spark-defaults.conf, SparkConf以及 命令行直接指定的值才会显示。对于其它的配置属性,你可以认为程序用到了默认的值。