Spark源碼剖析(三):SparkContext原理與源碼剖析

一:SparkContext原理

千言萬語不抵一張圖啊!(看不懂也別急,把下面的源碼看完後再回過來看這張圖你就懂了)web

@1-1

1-1apache

二:SparkContext源碼剖析

SparkContext最重要的功能就是建立了TaskScheduler、DAGSchedule和SparkUI(4040),可是咱們這篇文章主要剖析TaskScheduler的源碼(重要!),其他兩個暫不作詳解。服務器

廢話很少說,源碼入口爲:spark-1.3.0\core\src\main\scala\org\apache\spark\SparkContext.scalaapp

@2-1

2-1spa

 
  
這裏能夠看到SparkContext先建立TaskScheduler,接着建立DAGSchedule,最後調用TaskScheduler的start方法啓動。 

TaskScheduler初始化

  1. 首先調用createTaskScheduler方法,該方法會根據應用程序的提交模式提供不一樣的初始化程序(咱們這裏分析standalone模式),首先建立TaskSchedulerImpl(就是咱們所說的TaskScheduler,底層主要基於SparkDeploySchedulerBackend來工做)和SparkDeploySchedulerBackend(在底層接收TaskSchedulerImpl的控制,實際上負責與Master的註冊、Executor的反註冊,task發送到Executor等操做)。 
      
    圖2-1中的createTaskScheduler方法
@2-2

2-2線程

 
  
TaskSchedulerImpl的官方簡介
@2-3

2-3scala

 
  1. 接着圖2-2中TaskSchedulerImpl執行其init方法,建立SchedulePool調度池,它有不一樣的優先策略(好比FIFO)。
@2-4

2-4code

 
  1. 而後返回圖2-1中TaskSchedulerImpl調用其start方法,該start方法中會調用SparkDeploySchedulerBackend的start方法。
@2-5

2-5對象

@2-6

2-6資源

  1. 在SparkDeploySchedulerBackend的start方法中,會建立AppClient對象,該對象的start方法又會啓動ClientActor線程,該線程會去調用一系列方法registerWithMaster() -> tryRegisterAllMasters(),最終tryRegisterAllMasters()方法會向全部Master發送RegisterApplication(是case class,裏面封裝了Application的信息)進行Application的註冊。

Alt text

Alt text

Alt text

Alt text

Alt text

Alt text

  1. Spark Master接收到該Application的註冊後,會爲其分配資源,隨後通知相關的Worker爲該Application啓動相對應的Executor。 
  2. 全部Executor啓動後會反向註冊到SparkDeploySchedulerBackend(這樣Driver中的TaskSchedule就知道哪些Executor爲其運行Application了)。 

DAGSchedule初始化

DAGSchedule位於TaskSchedule後被建立,底層基於DAGScheduleEventProcessActor線程進行通訊。

Alt text 
  
DAGSchedule源碼簡介

Alt text

SparkUI(4040)

SparkContext中還啓動了一個jetty服務器,來提供web服務,顯示application運行的狀態,這個端口咱們在跑長時間應用的時候常常會使用到。

Alt text

Alt text

相關文章
相關標籤/搜索