SparkContext是整個spark程序通往集羣的唯一通道,他是程序的起點,也是程序的終點。
我們的每一個spark個程序都需要先創建SparkContext,接著調用SparkContext的方法, 比如說 sc.textFile(filepath),程序最後也會調用sc.stop()來退出。讓我們來一起看下SparkContext裡面到底是如何實現的吧!
1 SparkContext內的三大核心對象:DAGScheduler,TaskScheduler,SchedulerBackend
DAGScheduler:面向Stage調度機制的高層調度器,會為每個job計算一個Stage的DAG(有向無環圖)。追蹤RDD和Stage的輸出是否物化(寫磁碟或內存),並且執行一個最優的調度機制來執行。將stage作為tasksets提交到底層的TaskScheduler並在集羣上運行。DAGScheduler監控作業運行調度的過程,如果某個階段運行失敗,會重新提交提交該調度階段。
TaskScheduler:是一個介面,底層調度器。會根據ClusterManager的不同有不同的實現,在Standalone模式下的實現為TaskSchedulerImpl。接收DAGScheduler發過來的任務集,並以任務的形式分發到集羣worker節點的Executor中去運行,任務失敗TaskScheduler負責重試。如果TaskScheduler發現某個任務一直沒運行完,可能會啟動同樣的任務去運行一個任務,結果選取早運行完的那個任務的(預測執行)。
SchedulerBackend:是一個介面,根據ClusterManager的不同會有不同的實現,Standalone模式下是StandaloneSchedulerBackend(2.3版本, 1.x版本是SparkDeploySchedulerBackend)底層接受TaskSchedulerImpl的控制,實際負責Master的註冊和Tasks發送到Executor等操作。
2.1 圖示SparkContext實例化過程
如下圖所示,我們看下SparkContext在實例化過程中,會創建多少核心實例來完成整個應用程序的註冊。