本篇文章就要根據源碼分析SparkContext所作的一些事情,用過Spark的開發者都知道SparkContext是編寫Spark程序用到的第一個類,足以說明SparkContext的重要性;這裏先摘抄SparkContext源碼註釋來 簡單介紹介紹SparkContext,註釋的第一句話就是說SparkContext爲Spark的主要入口點,簡明扼要,如把Spark集羣看成服務端那Spark Driver就是客戶端,SparkContext則是客戶端的核心;如註釋所說 SparkContext用於鏈接Spark集羣、建立RDD、累加器(accumlator)、廣播變量(broadcast variables),因此說SparkContext爲Spark程序的根本都不爲過,這裏使用的Spark版本爲2.0.1;apache
圖片來自Spark官網,能夠看到SparkContext處於DriverProgram核心位置,全部與Cluster、Worker Node交互的操做都須要SparkContext來完成;網絡
一、SparkConf
SparkConf爲Spark配置類,配置已鍵值對形式存儲,封裝了一個ConcurrentHashMap類實例settings用於存儲Spark的配置信息;配置項包括:master、appName、Jars、ExecutorEnv等等;
二、SparkEnv
SparkEnv能夠說是Context中很是重要的類,它維護着Spark的執行環境,包含有:serializer、RpcEnv、block Manager、map output tracker、etc等;全部的線程均可以經過SparkCotext訪問到同一個SparkEnv對象;SparkContext經過SparkEnv.createDriverEnv建立SparkEnv實例;在SparkEnv中包含了以下主要對象:app
SecurityManager:用於對權限、帳號進行管理、Hadoop YARN模式下的證書管理等;
RpcEnv:爲Rpc環境的封裝,以前使用的是Akka如今默認已經使用了Netty做爲Spark的Rpc通訊框架,Spark中有RpcEnvFactory trait特質默認實現爲NettyRpcEnvFactory,在Factory中默認使用了Jdk的Serializer做爲序列化工具;
SerializerManager:用於管理Spark組件的壓縮與序列化;
BroadcastManager:用與管理廣播對象,默認使用了TorrentBroadcastFactory廣播工廠;
MapOutputTracker:跟蹤Map階段結果的輸出狀態,用於在reduce階段獲取地址與輸出結果,若是當前爲Driver則建立MapOutputTrackerMaster對象不然建立的是MapOutputTrackerWorker二者都繼承了MapOutputTracker類;
ShuffleManager:用於管理遠程和本地Block數據shuffle操做,默認使用了SortShuffleManager實例;
MemoryManager:用於管理Spark的內存使用策略,有兩種模式StaticMemoryManager、UnifiedMemoryManager,第一種爲1.6版本以前的後面那張爲1.6版本時引入的,當前模式使用第二種模式;兩種模式區別爲粗略解釋爲第一種是靜態管理模式,而第二種爲動態分配模式,execution與storage之間能夠相互「借」內存;
BlockTransferService:塊傳輸服務,默認使用了Netty的實現,用於獲取網絡節點的Block或者上傳當前結點的Block到網絡節點;
BlockManagerMaster:用於對Block的協調與管理;
BlockManager:爲Spark存儲系統重要組成部分,用於管理Block;
MetricsSystem:Spark測量系統;框架
三、LiveListenerBus
異步傳遞Spark事件監聽與SparkListeners監聽器的註冊;
四、JobProgressListener
JobProgressListener監聽器用於監聽Spark中任務的進度信息,SparkUI上的任務數據既是該監聽器提供的,監聽的事件包括有,Job:active、completed、failed;Stage:pending、active、completed、skipped、failed等;JobProgressListener最終將註冊到LiveListenerBus中;異步
五、SparkUI
SparkUI爲Spark監控Web平臺提供了Spark環境、任務的整個生命週期的監控;分佈式
六、TaskScheduler
TaskScheduler爲Spark的任務調度器,Spark經過他提交任務而且請求集羣調度任務;TaskScheduler經過Master匹配部署模式用於建立TashSchedulerImpl與根據不一樣的集羣管理模式(local、local[n]、standalone、local-cluster、mesos、YARN)建立不一樣的SchedulerBackend實例;工具
七、DAGScheduler
DAGScheduler爲高級的、基於stage的調度器,爲提交給它的job計算stage,將stage做爲tasksets提交給底層調度器TaskScheduler執行;DAGScheduler還會決定着stage的最優運行位置;
八、ExecutorAllocationManager
根據負載動態的分配與刪除Executor,可經過ExecutorAllcationManager設置動態分配最小Executor、最大Executor、初始Executor數量等配置,調用start方法時會將ExecutorAllocationListener加入到LiveListenerBus中監聽Executor的添加、移除等;
九、ContextClearner
ContextClearner爲RDD、shuffle、broadcast狀態的異步清理器,清理超出應用範圍的RDD、ShuffleDependency、Broadcast對象;清理操做由ContextClearner啓動的守護線程執行;
十、SparkStatusTracker
低級別的狀態報告API,對job、stage的狀態進行監控;包含有一個jobProgressListener監聽器,用於獲取監控到的job、stage事件信息、Executor信息;
十一、HadoopConfiguration
Spark默認使用HDFS來做爲分佈式文件系統,HadoopConfigguration用於獲取Hadoop配置信息,經過SparkHadoopUtil.get.newConfiguration建立Configuration對象,SparkHadoopUtil 會根據SPARK_YARN_MODE配置來判斷是用SparkHadoopUtil或是YarnSparkHadoopUtil,建立該對象時會將spark.hadoop.開頭配置都複製到HadoopConfugration中;oop
以上的對象爲SparkContext使用到的主要對象,能夠看到SparkContext包含了Spark程序用到的幾乎全部核心對象可見SparkContext的重要性;建立SparkContext時會添加一個鉤子到ShutdownHookManager中用於在Spark程序關閉時對上述對象進行清理,在建立RDD等操做也會判斷SparkContext是否已stop;
一般狀況下一個Driver只會有一個SparkContext實例,但可經過spark.driver.allowMultipleContexts配置來容許driver中存在多個SparkContext實例;源碼分析
參考資料:
http://spark.apache.org/docs/latest/spa