Spark 配备了各种各样的系统配置参数,SparkConf 是 Spark 的配置类。Spark 中的每一个组件都直接或者间接地使用着它所存储的属性
/** 在 class SparkConf 中 可以看到Spark的配置所存储的数据结构,可见 key 和 value 都是 String 类型*/
private val settings = new ConcurrentHashMap[String, String]()
Spark 的配置通过3种方式获取
- 来源于系统参数中以 spark. 作为前缀的属性
- 使用 SparkConf 的 API 进行设置
- 从其他 SparkConf 中克隆
系统属性中的配置
可以看到SparkConf这个类本身就是一个带构造器参数的,这个属性是 loadDefaults,当 loadDefaults 为 true 时,将会从系统属性中加载 Spark 配置
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {
/**......*/
/** 通过这个构造器可以发现,默认的情况下是会从系统属性中加载 Spark 配置的 */
def this() = this(true)
/**......*/
/** 这里可以看到在默认的情况下,是会调用方法加载系统属性的*/
if (loadDefaults) {
loadFromSystemProperties(false)
}
private[spark] def loadFromSystemProperties(silent: Boolean): SparkConf = {
// 加载任何以 spark. 为前缀的系统变量,调用的方法是 Utils 工具类的 getSystemProperties 方法,作用为获取系统的键值对属性
for ((key, value) <- Utils.getSystemProperties if key.startsWith("spark.")) {
set(key, value, silent)
}
this
}
/**......*/
/** 实际将属性放入settings的方法*/
private[spark] def set(key: String, value: String, silent: Boolean): SparkConf = {
if (key == null) {
throw new NullPointerException("null key")
}
if (value == null) {
throw new NullPointerException("null value for " + key)
}
if (!silent) {
logDeprecationWarning(key)
}
settings.put(key, value)
this
}
/**......*/
}
/** 加载系统变量的方法,会获取到已经明确设置的属性和仅定义了默认值的属性,从而返回一个可以安全迭代的系统属性Map*/
def getSystemProperties: Map[String, String] = {
System.getProperties.stringPropertyNames().asScala
.map(key => (key, System.getProperty(key))).toMap
}
使用SparkConf配置的 API
作为最常用的给 SparkConf 添加配置的方式是使用 SparkConf 中提供的 API,这些 API 最终实际都是调用了如下 set 方法
/** 添加配置参数,在 SparkConf 中有很多重载方法实际最终调用的是该方法 */
def set(key: String, value: String): SparkConf = {
set(key, value, false)
}
在对 SparkConf 中设置时也会出现 setMaster、setAppName、setJars 等方法也都是最终调用了上面的 set 方法
def setMaster(master: String): SparkConf = {
set("spark.master", master)
}
def setAppName(name: String): SparkConf = {
set("spark.app.name", name)
}
克隆 SparkConf 配置
SparkConf 继承了 Cloneable 特质并实现了 clone 方法,提高了代码的可复用性
/** 继承了 Cloneable 特质*/
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {
/** 重写了 clone 方法,从而达到可以便捷的复用 SparkConf 的作用 */
override def clone: SparkConf = {
val cloned = new SparkConf(false)
settings.entrySet().asScala.foreach { e =>
cloned.set(e.getKey(), e.getValue(), true)
}
cloned
}
}