Spark-2.4.0 源碼學習系列《一 》 - SparkConf

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的配置信息。這裏不再一一列舉,在後面的源碼學習中用到時再來看。

注:請尊重原創,轉載請註明出處。該系列不定時更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章