SparkConf源码解读

1.主要功能:SparkConf是Spark的配置类,配置spark的application的应用程序,使用(key,value)来进行存储配置信息。

2.主要形式:val conf=new SparkConf(),读取任何spark.*的配置,包括开发人员所设置的配置,因为SparkConf中含有辅助构造器:def this()=this(true),此辅助构造器中布尔值为true说明读取外部配置信息。在配置单元里可以设置def this()=this(false),跳过外在配置信息。

3.Spark配置:

  Spark中的每一个组件都直接或者间接的使用SparkConf所存储的配置属性,这些属性都存储在数据结构ConcurrentHashMap中即

  private val settings=new ConcurrentHashMap[String,String]()

4.如何获取SparkConf配置:

  (1)来源于系统参数(即System.getproperties获取的属性)中以Spark.作为前缀的那部分属性

  (2)使用SparkConf的API进行设置

  (3)从其它SparkConf中克隆

(1)系统属性中配置

  在SparkConf中有一个Boolean类型属性loadDefaults,当loadDefaults为true时,将从系统属性中加载Spark配置,代码如下:

扫描二维码关注公众号,回复: 7797703 查看本文章
/** Create a SparkConf that loads defaults from system properties and the classpath */
def this() = this(true) //构造方法
 
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
}
loadFromSystemProperties

  上述代码调用了Utils工具类的getSystemProperties方法,其作用为获取系统的键值对属性,loadFromSystemProperties获取到系统属性后,使用scala守卫过滤出以"spark."字符串为前缀的Key和value并且调用set方法,最终设置到settings中

利用set方法存储配置属性

(2)使用SparkConf配置的API

  给SparkConf添加配置的一种常见方式是使用SparkConf提供的API,其中这些API最终实际调用了set的重载方法如:

重载的set方法
/** Set a configuration variable. */
def set(key: String, value: String): SparkConf = {
  set(key, value, false)
}

  Sparkconf的setMaster,setAppName,setJars,setExecutorEnv,setSparkHome,setAll等方法都是通过上述的set方法完成Spark配置的,如setMaster和setAppName

/**
 * The master URL to connect to, such as "local" to run locally with one thread, "local[4]" to
 * run locally with 4 cores, or "spark://master:7077" to run on a Spark standalone cluster.
 */
def setMaster(master: String): SparkConf = {
  set("spark.master", master)
}
 
/** Set a name for your application. Shown in the Spark web UI. */
def setAppName(name: String): SparkConf = {
  set("spark.app.name", name)
}
添加配置

(3)克隆SparkConf配置

  在某些情况下,同一个SparkConf实例中的配置信息需要被多个组件公用,而我们往往会想到的方法是将SparkConf实例定义为全局变量或者通过参数传递给其他组件,但是这样会引入并发问题,虽然settings数据结构为ConcurrentHashMap是线程安全的,而且ConcurrentHashMap也被证明是高并发下性能表现不错的数据结构,但是存在并发,就一定有性能的损失问题,也可以创建一个SparkConf实例b,并将a中的配置信息全部拷贝到b中,这样会浪费内存,导致代码散落在程序的各个部分。

  SparkConf继承了Cloneable物质并实现了clone方法,可以通过Cloneable物质提高代码的可利用性

Cloneable物质
class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging {
    def this() = this(true)
 
    /** Copy this object */
    override def clone: SparkConf = {
      val cloned = new SparkConf(false)
      settings.entrySet().asScala.foreach { e =>
        cloned.set(e.getKey(), e.getValue(), true)
      }
      cloned
    }
}
def this() = this(true)

猜你喜欢

转载自www.cnblogs.com/hdc520/p/11825548.html