SparkConf是Spark程序的配置类,以键值对的方式存储各种各样的Spark参数。通常情况下,可以通过 new SparkConf()来创建一个Sparkconf对象,这种方式会加载Java系统属性中任何以“spark.”开头的参数,并设置到应用程序中。SparkConf中设置的参数相较于系统属性具有优先级(会覆盖系统参数)。SparkConf中最重要的一个参数是settings,是一个ConcurrentHashMap[String, String],用来存储各种各样的参数。
下面我们来看一下SparkConf的源代码,先看初始化时干了哪些事(定义的方法先不管)
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {
import SparkConf._
/** Create a SparkConf that loads defaults from system properties and the classpath */
def this() = this(true)
private val settings = new ConcurrentHashMap[String, String]()
1. 调用SparkConf构造函数:def this() = this(true),可见new SparkConf()是可以传入参数的(默认true),这个参数代表是否要加载默认系统属性。
2. 创建一个Map来存储参数:private val settings = new ConcurrentHashMap[String, String]()。ConcurrentHashMap是一个应用了锁分段技术的线程安全的具有并发能力的HashMap。
@transient private lazy val reader: ConfigReader = {
val _reader = new ConfigReader(new SparkConfigProvider(settings))
_reader.bindEnv(new ConfigProvider {
override def get(key: String): Option[String] = Option(getenv(key))
})
_reader
}
if (loadDefaults) {
loadFromSystemProperties(false)
}
3. 懒加载一个ConfigReader:一个用于读取配置信息和执行变量替换的帮助类。
4. 判断是否需要加载系统变量。
private final val avroNamespace = "avro.schema."
5. 定义avro命名空间变量。
SparkConf的伴生对象中也定义了几个常量,我们先来看一下:
private val deprecatedConfigs: Map[String, DeprecatedConfig] = {...}
private val configsWithAlternatives = Map[String, Seq[AlternateConfig]](...)
private val allAlternatives: Map[String, (String, AlternateConfig)] = {...}
1. 过期配置Map。配置参数的key和过期信息的映射。
2. 当前key(过期的)和当前版本spark使用的key的映射。
3. configsWithAlternatives视图,用于提升查询过期key的效率。
此外,SparkConf中还定义了一大堆的set,get方法,用于设置和获取Spark的配置信息。这里不再一一列举,在后面的源码学习中用到时再来看。
注:请尊重原创,转载请注明出处。该系列不定时更新。