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在實例化過程中,會創建多少核心實例來完成整個應用程序的註冊。

?

2.2 時序圖

?

3 主要內容描述

  • createTaskScheduler
  • createSchedulerBackend
  • SchedulerBackend的initialize初始化構造默認FIFO調度喫
  • new DAGScheduler
  • 創建StandaloneAppClient與spark集羣通信
  • 創建AppClient,ClientEndPoint(向master註冊)
  • 發消息RegisterApplication
  • ClientEndpoint.receive()函數接收master的回復消息

4 通過源碼看SparkContext實例化過程(Standalone模式)

scala中不在方法裏的成員都會被實例化,開始最關鍵的方法是createTaskScheduler,它是位於 SparkContext 的 構造函數中,當它實例化時會直接被調用。

createTaskScheduler創建了TaskSchedulerImpl並通過StandaloneSchedulerBackend對其進行初始化。

createTaskScheduler返回scheduleBackend和TaskScheduler, 然後又基於TaskScheduler構造DAGScheduler。

  • SparkContext調用createTaskScheduler方法,返回SchedulerBackend和TaskScheduler。

  • 下createTaskScheduler方法內部:根據不同的master url創建不同的TaskScheduler實現和不同的SchedulerBackend實現。 master url就是創建SparkContext的時候傳的,例如下面的local:val conf = new SparkConf().setAppName("TestApp").setMaster("local") val sc = new SparkContext(conf)

?

  • taskSchedulerImpl的初始化方法,創建一個默認FIFO的調度池:

?

  • taskSchedulerImpl初始化後,隨即為其設置DAGScheduler,然後調用其start()方法:

?

  • 在taskSchedulerImpl的start()方法中再調用backend(StandaloneSchedulerBackend)的start()方法,其中最重要的就是創建ApplicationDescription和AppClient

?

  • 創建ApplicationDescription和AppClient

?

  • ApplicationDescription存放當前應用程序信息,name,cores,memory等。
  • AppClient是Application與Spark通信的組件。在appClient.start()的時候會創建內部類ClientEndPoint

?

  • clientEndPoint註冊master。

?

  • 註冊的時候會從線程池中拿出一個線程並且會帶上APPDescription中的作業信息。

?

  • ClientEndpoint.receive接收master返回的消息,根據不同的返回消息做不同的操作。

?

  • SparkContext.DAGScheduler

?

  • 創建SparkUI

?

以上就是SparkContext源碼的構造過程,感謝閱讀。


程序員燈塔:如何進BAT,有了這個篇面試祕籍,成功率高達80%!!(附資料)?

zhuanlan.zhihu.com
圖標

程序員燈塔:詳細講解MapReduce二次排序過程?

zhuanlan.zhihu.com
圖標

程序員燈塔:教程+資源,python scrapy實戰爬取知乎最性感妹子的爆照合集?

zhuanlan.zhihu.com
圖標

推薦閱讀:
相關文章