sparkcontext是開發spark應用的入口,它負責和整個叢集的互動,包括建立rdd,accumulators and broadcast variables。了解spark的架構,需要從這個入口開始。下圖是官網的架構圖。
driverprogram就是使用者送出的程式,這裡邊定義了sparkcontext的執行個體。sparkcontext定義在core/src/main/scala/org/apache/spark/sparkcontext.scala。
spark預設的構造函數接受org.apache.spark.sparkconf, 通過這個參數我們可以自定義本次送出的參數,這個參數會覆寫系統的預設配置。
先上一張與sparkcontext相關的類圖:
下面是sparkcontext非常重要的資料成員的定義:
通過createtaskscheduler,我們可以獲得不同資源管理類型或者部署類型的排程器。看一下現在支援的部署方法:
主要的邏輯從line 20開始。主要通過傳入的master url來生成scheduler 和 scheduler backend。對于常見的standalone的部署方式,我們看一下是生成的scheduler 和 scheduler backend:
org.apache.spark.scheduler.taskschedulerimpl通過一個schedulerbackend管理了所有的cluster的排程;它主要實作了通用的邏輯。對于系統剛啟動時,需要了解兩個接口,一個是initialize,一個是start。這個也是在sparkcontext初始化時調用的:
由此可見,初始化主要是schedulerbackend的初始化,它主要時通過叢集的配置來獲得排程模式,現在支援的排程模式是fifo和公平排程,預設的是fifo。
start的實作如下:
主要是backend的啟動。對于非本地模式,并且設定了spark.speculation為true,那麼對于指定時間未傳回的task将會啟動另外的task來執行。其實對于一般的應用,這個的确可能會減少任務的執行時間,但是也浪費了叢集的計算資源。是以對于離線應用來說,這個設定是不推薦的。
org.apache.spark.scheduler.cluster.sparkdeployschedulerbackend是standalone模式的schedulerbackend。它的定義如下:
看一下它的start:
接下來,我們将對taskscheduler,schedulerbackend和dag scheduler進行詳解,來逐漸揭開他們的神秘面紗。