Spark源码之SparkConf解析

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
  }
}
  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值