在《Spark源碼分析:多種部署方式之間的區別與聯繫(1)》咱們談到了SparkContext的初始化過程會作好幾件事情(這裏就再也不列出,能夠去《Spark源碼分析:多種部署方式之間的區別與聯繫(1)》查看),其中作了一件重要的事情就是建立TaskScheduler。 微信
1 | // Create and start the scheduler |
2 | private[spark] var taskScheduler =<span class="wp_keywordlink_affiliate"><a href="http://www.iteblog.com/archives/tag/spark" title=""target="_blank"data-original-title="View all posts in Spark">Spark</a></span>Context.createTaskScheduler(this, master) |
在createTaskScheduler方法中,會根據用戶傳進來的master URL分別初始化不一樣的SchedulerBackend和ExecutorBackend。並且從代碼中咱們能夠看到master URL多大九種格式。可是在代碼中SchedulerBackend的種類可沒九種,只有五種;而ExecutorBackend只有三種,咱們先來看看這些SchedulerBackend和ExecutorBackend的類繼承關係: 框架
每個Application都對應了一個SchedulerBackend和多個ExecutorBackend。下面咱們分別介紹各類運行模式所涉及到的類 oop
local模式出了僞集羣模式(local-cluster),全部的local都是用到了LocalBackend和TaskSchedulerImpl類。LocalBackend接收來自TaskSchedulerImpl的receiveOffers()調用,並根據運行Application傳進來的CPU核生成WorkerOffer,並調用scheduler.resourceOffers(offers)生成Task,最後經過 executor.launchTask來執行這些Task。 源碼分析
Standalone模式使用SparkDeploySchedulerBackend和TaskSchedulerImpl,SparkDeploySchedulerBackend是繼承自CoarseGrainedSchedulerBackend類,並重寫了其中的一些方法。 post
CoarseGrainedSchedulerBackend是一個粗粒度的資源調度類,在Spark job運行的整個期間,它會保存全部的Executor,在task運行完的時候,並不釋放該Executor,也不向Scheduler申請一個新的Executor。Executor的啓動方式有不少中,須要根據Application提交的Master URL進行判斷。在CoarseGrainedSchedulerBackend中封裝了一個DriverActor類,它接受Executor註冊(RegisterExecutor)、狀態更新(StatusUpdate)、響應Scheduler的ReviveOffers請求、殺死Task等等。 測試
在本模式中將會啓動一個或者多個CoarseGrainedExecutorBackend。具體是經過AppClient類向Master請求註冊Application。當註冊成功以後,Master會向Client進行反饋,並調用schedule啓動Driver和CoarseGrainedExecutorBackend,啓動的Executor會向DriverActor進行註冊。而後CoarseGrainedExecutorBackend經過aunchTask方法啓動已經提交的Task。 this
yarn-cluster集羣模式涉及到的類有YarnClusterScheduler和YarnClusterSchedulerBackend。YarnClusterSchedulerBackend一樣是繼承自CoarseGrainedSchedulerBackend。而YarnClusterScheduler繼承自TaskSchedulerImpl,它只是簡單地對TaskSchedulerImpl進行封裝,並重寫了getRackForHost和postStartHook方法。 spa
Client類經過YarnClient在Hadoop集羣上啓動一個Container,並在其中運行ApplicationMaster,並經過Yarn提供的接口在集羣中啓動多個Container用於運行CoarseGrainedExecutorBackend,並向CoarseGrainedSchedulerBackend中的DriverActor進行註冊。 blog
yarn-cluster集羣模式涉及到的類有YarnClientClusterScheduler和YarnClientSchedulerBackend。YarnClientClusterScheduler繼承自TaskSchedulerImpl,並對其中的getRackForHost方法進行了重寫。
Yarn-client模式下,會在集羣外面啓動一個ExecutorLauncher來做爲driver,並想集羣申請Container,來啓動CoarseGrainedExecutorBackend,並向CoarseGrainedSchedulerBackend中的DriverActor進行註冊。 繼承
Mesos模式調度方式有兩種:粗粒度和細粒度。粗粒度涉及到的類有CoarseMesosSchedulerBackend和TaskSchedulerImpl類;而細粒度涉及到的類有MesosSchedulerBackend和TaskSchedulerImpl類。CoarseMesosSchedulerBackend和 MesosSchedulerBackend都繼承了MScheduler(實際上是Mesos的Scheduler),便於註冊到Mesos資源調度的框架中。選擇哪一種模式能夠經過spark.mesos.coarse參數配置。默認的是MesosSchedulerBackend。