Spark提供了三个位置来配置系统:

  • Spark Properties(Spark 属性)控制大多数 application 参数,并且可以使用 SparkConf 对象设置
  • 通过配置每个节点上的 conf/spark-env.sh 脚本,可以配置每台机器的环境变量,如 ip 地址
  • 日志可以通过 log4j.properties 配置

Spark 属性

Spark属性控制 application 绝大多数配置并可为每个 application 单独配置。这些属性可以被在传给你的 SparkContext 的 SparkConf上直接设置。SparkConf 允许你配置一些常用属性(如 master URL和application name),和通过 set() 方法设置键值对效果一样。你可以像下面例子一样初始化一个 application:

val conf = new SparkConf()
             .setMaster("local")
             .setAppName("CountingSheep")
             .set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)

动态加载 Spark 属性

有些情况下,你可能想避免硬编码某些 SparkConf 配置。例如,如果你想用不同的 masters 或不同的内存数执行相同的程序。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。spark-submit 通过 --conf 标志可以设置任何 spark 属性。运行 ./bin/spark-submit --help 会列出这些选项的完整列表。

bin/spark-submit 也会读取并加载 conf/spark-defaults.conf。spark-defaults.conf 中每行包含一个由空格风格的key value对。如:

spark.master            spark://5.6.7.8:7077
spark.executor.memory   512m
spark.eventLog.enabled  true
spark.serializer        org.apache.spark.serializer.KryoSerializer

任何被指定为标记或在属性文件中的值将被传给 application 并和通过 SparkConf 指定的值合并。通过 SparkConf 直接指定的属性具有最高优先级,然后是传给 spark-submit 或 spark-shell 的标记,最后是 spark-defaults.conf 中的配置。

查看 Spark 属性

application 页面 http://driver:4040 在“Environment”标签页列出了 Spark 属性。这是一个非常有用的地方让你确认你是否正确配置了属性。只有通过 spark-defaults.conf 或 SparkConf 明确指定的属性才会出现在页面上。所有其他的配置,你可以假定使用了默认值。

可用属性

大部分属性有合理的默认值。以下为最常用的属性设置:

Application 属性

属性名

默认值

含义

spark.app.name

(none)

application名,将会出现在页面和日志中

spark.master

(none)

集群管理地址(YARN 模式下为 ResourceManager 地址)

spark.executor.memory

512m

每个 executor 进程使用的内存数,和 JVM 内存描述相同(如 512m、2g)

spark.serializer

org.apache.spark.serializer.JavaSerializer

用来序列化通过网络传输或需要缓存的对象的类。默认使用 Java 序列化对于所有可序列化的 Java 对象有效,但非常慢。如果需要更快的,建议使用org.apache.spark.serializer.KryoSerializer并配置 Kryo 序列化。可以是任何 org.apache.spark.Serializer 的子类

spark.kryo.registrator

(none)

如果使用 Kryo 序列化,设置该类来向 Kryo 注册你的自定义类。该类需要继承 KryoRegistrator

spark.local.dir

/tmp

保存临时文件的目录。包括 map 的输出文件、保存在磁盘的 RDD。这应是一个速度很快的本地磁盘。可以是逗号分隔的多个不同的目录。注意,在 Spark 1.0 及之后的版本中,该值会被 SPARK_LOCAL_DIRS(Standalone, Mesos)或LOCAL_DIRS (YARN) 环境变量覆盖

spark.logConf

false

当一个 SparkContext 启动,以 INFO 等级记录有效的 SparkConf

除这些,下面的属性也可以使用并在某些情况下有用。


运行时环境

属性名

默认值

含义

spark.executor.memory

512m

每个 executor 进程使用的内存数,和 JVM 内存描述相同(如 512m、2g)

spark.executor.extraJavaOptions

(none)

要传给 executors 的额外的 JVM 选项字符串。注意,使用该选项设置 Spark 属性或堆大小是非法的。Spark 属性应用 SparkConf 或 spark-defaults 设置。配置文件和 spark-submit 脚本配合使用。堆大小可由 spark.executor.memory 设置

spark.executor.extraClassPath

(none)

添加到 executors classpath的额外 classpath 条目。用户通常不需要设置该选项

spark.executor.extraLibraryPath

(none)

当启动 executor JVM的指定的库路径

spark.python.worker.memory

512m

每个 python workder 进程聚合时的内存数。如果聚合过程中使用的内存超过了这个值,会将数据刷入磁盘中

spark.executorEnv.[EnvironmentVariableName]

(none)

添加由 EnvironmentVariableName 指定的环境变量至 executor 进程。用户可以指定多个该选型以设置多个环境变量

spark.mesos.executor.home

driver side SPARK_HOME


Shuffle 行为

属性名

默认值

含义

spark.shuffle.consolidateFiles

false

如果设为“true”,shuffle过程中会创建中间文件。创建少量文件可以提高整个文件系统在处理大量 reduce task 时的表现。当使用 ext4 或 xfs 文件系统时,建议使用 “true”。在 ext3 上,由于文件系统的局限性,该选项可能会降低8核以上机器的表现

未完待续~


Spark 用户界面

属性名

默认值

含义

spark.ui.port

4040

你的 application 的“仪表盘”端口,将显示内存和负载数据

spark.ui.retainedStages

1000

在垃圾回收前 Spark UI记住的 stages 的个数

spark.ui.killEnabled

true

是否允许从 web ui 上结束 stage 和对应的 job

spark.eventLog.enabled

false

是否记录 Spark 事件,对于在 application 完成后重建 web ui 是有用的

spark.eventLog.compress

false

是否压缩记录的事件,如果 spark.eventLog.enabled 为 true

spark.eventLog.dir

file:///tmp/spark-events

Spark event 日志存放的基本目录,如果 spark.eventLog.enabled 为 true。在该基本目录中,Spark 为每个 application 创建一个子目录。用户会希望将这设为一个统一目录,比如一个 HDFS 目录以便于 history 文件可以被 history 服务读取


压缩和序列化

未完待续


Executor 行为

属性名

默认值

含义

spark.default.parallelism

本地模式:本地机器的内核数;Mesos细粒度模式:8;其他:所有 executor 节点上的核心总数或2,取更大的一个

5

未完待续


调度

属性名

默认值

含义

spark.task.cpus

1

每个 task 分配的核心数

spark.task.maxFailures

4

在放弃 job 前每个 task 最大失败次数。应大于等于 1。重试次数为该值减 1

spark.scheduler.mode

FIFO

提交至同一个 SparkContext 的 job 之间的调度模式。可以设为 FAIR 来使用公平分享代替一个接一个的 FIFO。对于多用户服务有用

spark.cores.max

未设置

当运行在 standalone 或 Mesos 模式时,为每个 application 请求的最大 CPU 核心数时跨越整个集群的,而不是来自某台机器。如果未设置,standalone 模式下为 spark.deploy.defaultCores 的值, Mesos 模式下为无穷大(即所有可用的核心)

spark.speculation

false

如果设为 “true”,表示一个或多个 task 在一个 stage 执行缓慢将被重启


环境变量

通过环境变量可以设置明确的 Spark 设置,即读取 conf/spark-env.sh 脚本。在 Standalone 和 Mesos 模式下,这个文件可以给机器具体的信息,如主机名。
注意,当安装完 Spark 之后 conf/spark-env.sh 并不存在,你需要拷贝 conf/spark-env.sh.template 来创建。确定你执行了拷贝动作。
以下变量可以在 spark-env.sh 中设定:

环境变量

含义

JAVA_HOME

Java 安装路径(如果没有在你的 ‘PATH’ 中指定)

PYSPARK_PYTHON

为 PySpark 准备的 Python 使用的可执行的二进制文件

SPARK_LOCAL_IP

机器要绑定的 ip 地址

SPARK_PUBLIC_DNS

你的 Spark 程序将要通知其他机器的主机名

由于 spark-env.sh 是一个 shell 脚本,选项可以以更编程化的方式设置。如,你也许会通过查找网络接口来计算 SPARK_LOCAL_IP。

日志配置

Spark 使用 log4j 记录日志。你可以通过在 conf 目录下添加一个 log4j.properties 来配置。一种可行的方式是从 log4j.properties.template 拷贝