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的配置信息。這裏不再一一列舉,在後面的源碼學習中用到時再來看。
注:請尊重原創,轉載請註明出處。該系列不定時更新。