Spark可以通过三种方式配置系统:
- 通过SparkConf对象, 或者Java系统属性配置Spark的应用参数
- 通过每个节点上的conf/spark-env.sh脚本为每台机器配置环境变量
- 通过log4j.properties配置日志属性
Spark属性
Spark属性可以为每个应用分别进行配置,这些属性可以直接通过SparkConf设定,也可以通过set方法设定相关属性。
下面展示了在本地机使用两个线程并发执行的配置代码:
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("CountingSheep")
val sc = new SparkContext(conf)
对于部分时间参数需要制定单位,例如
- 时间单位:ms、s、m(min)、h、d、y分别表示毫秒、秒、分钟、小时、天和年。
- 存储单位:
1b (bytes)
1k or 1kb (kibibytes = 1024 bytes)
1m or 1mb (mebibytes = 1024 kibibytes)
1g or 1gb (gibibytes = 1024 mebibytes)
1t or 1tb (tebibytes = 1024 gibibytes)
1p or 1pb (pebibytes = 1024 tebibytes)
动态加载Spark配置
有时为了避免通过编码设定参数,可以通过创建空的SparkConf,并在调用脚本时制定相关参数
./bin/spark-submit --name "My app" --master local[4] --conf spark.eventLog.enabled=false
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar
spark shell和spark-submit提供两种方式动态加载配置
- 命令行参数动态设定,例如–conf –master
- 通过配置文件。spark-submit默认读取conf/spark-defaults.conf文件,每一行代表一个配置
spark.master spark://5.6.7.8:7077
spark.executor.memory 4g
spark.eventLog.enabled true
spark.serializer org.apache.spark.serializer.KryoSerializer
参数设置在执行时会进行合并,默认最高优先级是通过代码设置,其次是通过命令行参数,最后是默认的配置文件。
查看Spark配置
可以通过web界面http://:4040中的Environment查看Spark配置信息(仅显示spark-defaults.conf、SparkConf和命令行参数)。可以根据web页面确定配置属性是否生效。
配置参数 Available Properties
大部分配置参数都有默认值,以下是常用配置
Application Properties
属性 | 默认值 | 描述 |
---|---|---|
spark.app.name | (none) | 应用程序的名称,会在日志和webUI显示 |
spark.driver.cores | 1 | driver程序占用的CPU核数,只在cluster模式下有小。 |
spark.driver.maxResultSize | 1g | 对Spark每个action结果集大小的限制,最少是1M,若设为0则不限制大小。若Job结果超过限制则会异常退出,若结果集限制过大也可能造成OOM问题。 |
spark.driver.memory | 1g | driver进程可用的内存。注意:不能在代码中配置,因为此时driver已经启动,可以通过–driver-memory命令行参数或者配置文件进行配置。 |
spark.executor.memory | 1g | 每个executor可用的内存数量 (e.g. 2g, 8g). |
spark.extraListeners | (none) | 一系列实现SparkListener的类,spark监听总线会创建这些类的实例。 |
spark.local.dir | /tmp | 用于存储mpp输出文件和RDD缓存文件,常配置在SSD等存储设备上,可以通过逗号分隔指定多个目录。 注意: 在Spark 1.0 后续版本,会被SPARK_LOCAL_DIRS (Standalone, Mesos) or LOCAL_DIRS (YARN) 环境变量覆盖. |
spark.logConf | false | 将SparkConf 的有效配置作为INFO进行记录 |
spark.master | (none) | 集群master节点 |
运行时环境
属性 | 默认值 | 描述 |
---|---|---|
spark.driver.userClassPathFirst | false | 用户指定的jars优先于Spark的库。用于解决用户与环境的版本冲突 |
spark.executor.logs.rolling.maxRetainedFiles | (none) | 系统保留日志的最大数量,当超限时,旧的日志被删除,默认不启动 |
spark.executor.logs.rolling.time.interval | daily | 设置日志rolling时间间隔,默认rolling不启动 |
spark.executor.userClassPathFirst | false | executor执行时,用户指定的jars优先于Spark的库。用于解决用户与环境的版本冲突 |
spark.python.worker.memory | 512m | 每个worker进程在聚集时的内存上限,若超限则输出到硬盘 |
Shuffle 行为
属性 | 默认值 | 描述 |
---|---|---|
spark.reducer.maxSizeInFlight | 48m | 多个reduce任务从map输出获取结果的最大尺寸。由于每个reducer需要创建缓存保留数据,除非内存很大,一般不要修改此参数 |
spark.shuffle.compress | true | 是否对map的输出结果进行压缩,压缩器为spark.io.compression.codec |
spark.shuffle.file.buffer | 32k | 每个shuffle文件输出流的内存缓存区大小。这些缓冲区减少了系统IO的调用次数 |
spark.shuffle.manager | sort | shuffle数据的实现方法,包括sort和hash两种。sort内存利用率更改,从1.2版本后sort作为默认实现方法 |
spark.shuffle.service.enabled | false | 激活外部shuffle服务。服务维护executor写的文件,因而executor可以被安全移除。需要设置spark.dynamicAllocation.enabled 为true,同事指定外部shuffle服务。 |
spark.shuffle.service.port | 7337 | 默认的外部shuffle服务端口 |
spark.shuffle.sort.bypassMergeThreshold | 200 | 用于设置在Reducer的partition数目少于多少的时候,Sort Based Shuffle内部不使用Merge Sort的方式处理数据,而是直接将每个partition写入单独的文件。这个方式和Hash Based的方式是类似的,区别就是在最后这些文件还是会合并成一个单独的文件,并通过一个index索引文件来标记不同partition的位置信息。 从Reducer看来,数据文件和索引文件的格式和内部是否做过Merge Sort是完全相同的。这个可以看做SortBased Shuffle在Shuffle量比较小的时 |