/**
-
Configuration for a Spark application. Used to set various Spark parameters as key-value pairs.
-
Most of the time, you would create a SparkConf object with
new SparkConf()
, which will load -
values from any
spark.*
Java system properties set in your application as well. In this case, -
parameters you set directly on the
SparkConf
object take priority over system properties. -
For unit tests, you can also call
new SparkConf(false)
to skip loading external settings and -
get the same configuration no matter what the system properties are.
-
All setter methods in this class support chaining. For example, you can write
-
new SparkConf().setMaster("local").setAppName("My app")
. -
@param loadDefaults whether to also load values from Java system properties
-
@note Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified
-
by the user. Spark does not support modifying the configuration at runtime.
*/
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {
import SparkConf._
/** Create a SparkConf that loads defaults from system properties and the classpath
-
默认无参的构造方法,会传入loadDefaults为true
-
*/
def this() = this(true)
// 用于存放配置的Map(线程安全的ConcurrentHashMap对象)
private val settings = new ConcurrentHashMapString, String
// 配置读取器,使用懒加载方法初始化
@transient private lazy val reader: ConfigReader = {
// SparkConfigProvider对settings字典进行了包装
val _reader = new ConfigReader(new SparkConfigProvider(settings))
_reader.bindEnv(new ConfigProvider {
override def get(key: String): Option[String] = Option(getenv(key))
})
_reader
}
// 当该参数为true时,会从系统属性中加载Spark的配置
if (loadDefaults) {
loadFromSystemProperties(false)
}
private[spark] def loadFromSystemProperties(silent: Boolean): SparkConf = {
// Load any spark.* system properties
// 获取系统跟属性并加载以spark.开头的
for ((key, value) <- Utils.getSystemProperties if key.startsWith(“spark.”)) {
set(key, value, silent)
}
this
}
/** Set a configuration variable. */
def set(key: String, value: String): SparkConf = {
set(key, value, false)
}
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)
}
// 设置到setting中
settings.put(key, value)
this
}
private[spark] def set[T](entry: ConfigEntry[T], value: T): SparkConf = {
set(entry.key, entry.stringConverter(value))
this
}
private[spark] def set[T](entry: OptionalConfigEntry[T], value: T): SparkConf = {
set(entry.key, entry.rawStringConverter(value))
this
}
…//后面的代码省略
}
(1) loadDefaults参数决定是否加载System Properties中的属性。
/** Create a SparkConf that loads defaults from system properties and the classpath
-
默认无参的构造方法,会传入loadDefaults为true
-
*/
def this() = this(true)
如果loadDefaults参数为true,将会调用loadFromSystemProperties(…)方法加载相应的属性。
// 当该参数为true时,会从系统属性中加载Spark的配置
if (loadDefaults) {
loadFromSystemProperties(false)
}
private[spark] def loadFromSystemProperties(silent: Boolean): SparkConf = {
// Load any spark.* system properties
// 获取系统跟属性并加载以spark.开头的
for ((key, value) <- Utils.getSystemProperties if key.startsWith(“spark.”)) {
set(key, value, silent)
}
this
}
(2)SparkConf还在其伴生对象中定义了废弃的配置项以及一些在不同版本中发生变化的配置项
private val deprecatedConfigs: Map[String, DeprecatedConfig] = {
val configs = Seq(
DeprecatedConfig(“spark.cache.class”, “0.8”,
"The spark.cache.class property is no longer being used! Specify storage levels using " +
“the RDD.persist() method instead.”),
…//配置过多省略了
)
Map(configs.map { cfg => (cfg.key -> cfg) } : _*)
}
// 在不同版本中发生变化的配置项
// configsWithAlternatives则使用键值对的形式表示新旧配置项的变化,键为字符串,
// 表示配置项新的名称,值为AlternateConfig序列,包含多个AlternateConfig对象,
// AlternateConfig中的两个字符串参数分别表示配置项旧的名称以及出现的版本号
private val configsWithAlternatives = Map[String, Seq[AlternateConfig]](
“spark.executor.userClassPathFirst” -> Seq(
AlternateConfig(“spark.files.userClassPathFirst”, “1.3”)),
… //配置过多省略了
private val allAlternatives: Map[String, (String, AlternateConfig)] = {
configsWithAlternatives.keys.flatMap { key =>
configsWithAlternatives(key).map { cfg => (cfg.key -> (key -> cfg)) }
}.toMap
}
其中,
deprecatedConfigs使用的DeprecatedConfig中的三个字符串参数分别代表废弃的配置项名称、在哪个版本被废弃的以及废弃提示说明;configsWithAlternatives则使用键值对的形式表示新旧配置项的变化,键为字符串,表示配置项新的名称,值为AlternateConfig序列,包含多个AlternateConfig对象,
AlternateConfig中的两个字符串参数分别表示配置项旧的名称以及出现的版本号。
SparkConf配置项的设置有如下三种方法:
-
来源于系统参数
-
使用SparkConf的API进行设置
-
从其他SparkConf中克隆
(1)来源于系统参数
即使用System.getProperties获取的属性中以spark.作为前缀的那部分属性。
(2)使用SparkConf的API进行设置
SparkConf提供了大量以“set”开头的方法方便我们设置配置,如下代码所示:
总结
这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
作为前缀的那部分属性。
(2)使用SparkConf的API进行设置
SparkConf提供了大量以“set”开头的方法方便我们设置配置,如下代码所示:
总结
这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
[外链图片转存中…(img-TnBnwHAx-1714447072540)]