<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) <- 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用于指定應用程式名稱。