以下是整理的Spark中的一些配置参数,官方文档请参考Spark Configuration。
Spark提供三个位置用来配置系统:
- Spark属性:控制大部分的应用程序参数,可以用SparkConf对象或者Java系统属性设置
- 环境变量:可以通过每个节点的
conf/spark-env.sh
脚本设置。例如IP地址、端口等信息 - 日志配置:可以通过log4j.properties配置
Spark属性
Spark属性控制大部分的应用程序设置,并且为每个应用程序分别配置它。这些属性可以直接在SparkConf上配置,然后传递给SparkContext
。SparkConf
允许你配置一些通用的属性(如master URL、应用程序名称等等)以及通过set()
方法设置的任意键值对。例如,我们可以用如下方式创建一个拥有两个线程的应用程序。
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("CountingSheep")
.set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)
动态加载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
任何标签指定的值或者在配置文件中的值将会传递给应用程序,并且通过SparkConf
合并这些值。在SparkConf
上设置的属性具有最高的优先级,其次是传递给spark-submit
或者spark-shell
的属性值,最后是spark-defaults.conf
文件中的属性值。
优先级顺序:
SparkConf > CLI > spark-defaults.conf
查看Spark属性
在http://<driver>:4040
上的应用程序Web UI在Environment
标签中列出了所有的Spark属性。这对你确保设置的属性的正确性是很有用的。
注意:只有通过spark-defaults.conf, SparkConf以及命令行直接指定的值才会显示
。对于其它的配置属性,你可以认为程序用到了默认的值。
可用的属性
控制内部设置的大部分属性都有合理的默认值,一些最通用的选项设置如下:
应用程序属性
属性名称 | 默认值 | 含义 |
---|---|---|
spark.app.name | (none) | 你的应用程序的名字。这将在UI和日志数据中出现 |
spark.driver.cores | 1 | driver程序运行需要的cpu内核数 |
spark.driver.maxResultSize | 1g | 每个Spark action(如collect)所有分区的序列化结果的总大小限制。设置的值应该不小于1m,0代表没有限制。如果总大小超过这个限制,程序将会终止。大的限制值可能导致driver出现内存溢出错误(依赖于spark.driver.memory 和JVM中对象的内存消耗)。 |
spark.driver.memory | 512m | driver进程使用的内存数 |
spark.executor.memory | 512m | 每个executor进程使用的内存数。和JVM内存串拥有相同的格式(如512m,2g) |
spark.extraListeners | (none) | 注册监听器,需要实现SparkListener |
spark.local.dir | /tmp | Spark中暂存空间的使用目录。在Spark1.0以及更高的版本中,这个属性被SPARK_LOCAL_DIRS(Standalone, Mesos)和LOCAL_DIRS(YARN)环境变量覆盖。 |
spark.logConf | false | 当SparkContext启动时,将有效的SparkConf记录为INFO。 |
spark.master | (none) | 集群管理器连接的地方 |
运行环境
属性名称 | 默认值 | 含义 |
---|---|---|
spark.driver.extraClassPath | (none) | 附加到driver的classpath的额外的classpath实体。 |
spark.driver.extraJavaOptions | (none) | 传递给driver的JVM选项字符串。例如GC设置或者其它日志设置。注意,在这个选项中设置Spark属性或者堆大小是不合法的 。Spark属性需要用--driver-class-path 设置。 |
spark.driver.extraLibraryPath | (none) | 指定启动driver的JVM时用到的库路径 |
spark.driver.userClassPathFirst | false | (实验性)当在driver中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。 |
spark.executor.extraClassPath | (none) | 附加到executors的classpath的额外的classpath实体。这个设置存在的主要目的是Spark与旧版本的向后兼容问题。用户一般不用设置这个选项 |
spark.executor.extraJavaOptions | (none) | 传递给executors的JVM选项字符串。例如GC设置或者其它日志设置。注意,在这个选项中设置Spark属性或者堆大小是不合法的 。Spark属性需要用SparkConf对象或者spark-submit 脚本用到的spark-defaults.conf 文件设置。堆内存可以通过spark.executor.memory 设置 |
spark.executor.extraLibraryPath | (none) | 指定启动executor的JVM时用到的库路径 |
spark.executor.logs.rolling.maxRetainedFiles | (none) | 设置被系统保留的最近滚动日志文件的数量。更老的日志文件将被删除。默认没有开启。 |
spark.executor.logs.rolling.size.maxBytes | (none) | executor日志的最大滚动大小。默认情况下没有开启。值设置为字节 |
spark.executor.logs.rolling.strategy | (none) | 设置executor日志的滚动(rolling)策略。默认情况下没有开启。可以配置为time 和size 。对于time ,用spark.executor.logs.rolling.time.interval 设置滚动间隔;对于size ,用spark.executor.logs.rolling.size.maxBytes 设置最大的滚动大小 |
spark.executor.logs.rolling.time.interval | daily | executor日志滚动的时间间隔。默认情况下没有开启。合法的值是daily , hourly , minutely 以及任意的秒。 |
spark.files.userClassPathFirst | false | (实验性)当在Executors中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。 |
spark.python.worker.memory | 512m | 在聚合期间,每个python worker进程使用的内存数。在聚合期间,如果内存超过了这个限制,它将会将数据塞进磁盘中 |
spark.python.profile | false | 在Python worker中开启profiling。通过sc.show_profiles() 展示分析结果。或者在driver退出前展示分析结果。可以通过sc.dump_profiles(path) 将结果dump到磁盘中。如果一些分析结果已经手动展示,那么在driver退出前,它们再不会自动展示 |
spark.python.profile.dump | (none) | driver退出前保存分析结果的dump文件的目录。每个RDD都会分别dump一个文件。可以通过ptats.Stats() 加载这些文件。如果指定了这个属性,分析结果不会自动展示 |
spark.python.worker.reuse | true | 是否重用python worker。如果是,它将使用固定数量的Python workers,而不需要为每个任务fork() 一个Python进程。如果有一个非常大的广播,这个设置将非常有用。因为,广播不需要为每个任务从JVM到Python worker传递一次 |
spark.executorEnv.[EnvironmentVariableName] | (none) | 通过EnvironmentVariableName 添加指定的环境变量到executor进程。用户可以指定多个EnvironmentVariableName ,设置多个环境变量 |
spark.mesos.executor.home | driver side SPARK_HOME | 设置安装在Mesos的executor上的Spark的目录。默认情况下,executors将使用driver的Spark本地(home)目录,这个目录对它们不可见。注意,如果没有通过 spark.executor.uri 指定Spark的二进制包,这个设置才起作用 |
spark.mesos.executor.memoryOverhead | executor memory * 0.07, 最小384m | 这个值是spark.executor.memory< |