天天看點

深入了解Spark:核心思想與源碼分析. 3.1 SparkContext概述

<b>3.1 sparkcontext概述</b>

spark driver用于送出使用者應用程式,實際可以看作spark的用戶端。了解spark

driver的初始化,有助于讀者了解使用者應用程式在用戶端的處理過程。

spark driver的初始化始終圍繞着sparkcontext的初始化。sparkcontext可以算得上是所有spark應用程式的發動機引擎,轎車要想跑起來,發動機首先要啟動。sparkcontext初始化完畢,才能向spark叢集送出任務。在平坦的公路上,發動機隻需以較低的轉速、較低的功率就可以遊刃有餘;在山區,你可能需要一台能夠提供大功率的發動機才能滿足你的需求。這些參數都是通過駕駛員操作油門、檔位等傳送給發動機的,而sparkcontext的配置參數則由sparkconf負責,sparkconf就是你的操作面闆。

sparkconf的構造很簡單,主要是通過concurrenthashmap來維護各種spark的配置屬性。sparkconf代碼結構見代碼清單3-1。spark的配置屬性都是以“spark.”開頭的字元串。

代碼清單3-1 sparkconf代碼結構

class sparkconf(loaddefaults: boolean)

extends cloneable with logging {

import sparkconf._

def this() = this(true)

private val settings = new concurrenthashmap[string, string]()

if (loaddefaults) {

// 加載任何以spark.開頭的系統屬性

for ((key, value) &lt;- utils.getsystemproperties if

key.startswith("spark.")) {

set(key, value)

}

    }

//其餘代碼省略

現在開始介紹sparkcontext。sparkcontext的初始化步驟如下:

1)建立spark執行環境sparkenv;

2)建立rdd清理器metadatacleaner;

3)建立并初始化spark ui;

4)hadoop相關配置及executor環境變量的設定;

5)建立任務排程taskscheduler;

6)建立和啟動dagscheduler;

7)taskscheduler的啟動;

8)初始化塊管理器blockmanager(blockmanager是存儲體系的主要元件之一,将在第4章介紹);

9)啟動測量系統metricssystem;

10)建立和啟動executor配置設定管理器executorallocationmanager;

11)contextcleaner的建立與啟動;

12)spark環境更新;

13)建立dagschedulersource和blockmanagersource;

14)将sparkcontext标記為激活。

sparkcontext的主構造器參數為sparkconf,其實作如下。

class sparkcontext(config: sparkconf)

extends logging with executorallocationclient {

private val creationsite: callsite =

utils.getcallsite()

private val allowmultiplecontexts: boolean =

config.getboolean("spark.driver.allowmultiplecontexts", false)

sparkcontext.markpartiallyconstructed(this, allowmultiplecontexts)

上面代碼中的callsite存儲了線程棧中最靠近棧頂的使用者類及最靠近棧底的scala或者spark核心類資訊。utils.getcallsite的詳細資訊見附錄a。sparkcontext預設隻有一個執行個體(由屬性spark.driver.allowmultiplecontexts來控制,使用者需要多個sparkcontext執行個體時,可以将其設定為true),方法markpartiallyconstructed用來確定執行個體的唯一性,并将目前sparkcontext标記為正在建構中。

接下來會對sparkconf進行複制,然後對各種配置資訊進行校驗,代碼如下。

private[spark] val conf = config.clone()

conf.validatesettings()

if

(!conf.contains("spark.master")) {

throw new sparkexception("a master url must be set in your

configuration")

(!conf.contains("spark.app.name")) {

throw new sparkexception("an application name must be set in your

從上面校驗的代碼看到必須指定屬性spark.master 和spark.app.name,否則會抛出異常,結束初始化過程。spark.master用于設定部署模式,spark.app.name用于指定應用程式名稱。

繼續閱讀