Spark源碼分析:多種部署方式之間的區別與聯繫

《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的類繼承關係: 框架


若是想及時瞭解Spark、Hadoop或者Hbase相關的文章,歡迎關注微信公共賬號: iteblog_hadoop

每個Application都對應了一個SchedulerBackend和多個ExecutorBackend。下面咱們分別介紹各類運行模式所涉及到的類 oop

一、Local模式

  local模式出了僞集羣模式(local-cluster),全部的local都是用到了LocalBackend和TaskSchedulerImpl類。LocalBackend接收來自TaskSchedulerImpl的receiveOffers()調用,並根據運行Application傳進來的CPU核生成WorkerOffer,並調用scheduler.resourceOffers(offers)生成Task,最後經過 executor.launchTask來執行這些Task。 源碼分析

二、Standalone

  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

  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模式做業從提交到運行的整個過程請參見本博客文章: 《Spark on YARN集羣模式做業運行全過程分析》

四、yarn-client

  yarn-cluster集羣模式涉及到的類有YarnClientClusterScheduler和YarnClientSchedulerBackend。YarnClientClusterScheduler繼承自TaskSchedulerImpl,並對其中的getRackForHost方法進行了重寫。
  Yarn-client模式下,會在集羣外面啓動一個ExecutorLauncher來做爲driver,並想集羣申請Container,來啓動CoarseGrainedExecutorBackend,並向CoarseGrainedSchedulerBackend中的DriverActor進行註冊。 繼承

  yarn-client模式做業從提交到運行的整個過程請參見本博客文章: 《Spark on YARN客戶端模式做業運行全過程分析》

五、Mesos

  Mesos模式調度方式有兩種:粗粒度和細粒度。粗粒度涉及到的類有CoarseMesosSchedulerBackend和TaskSchedulerImpl類;而細粒度涉及到的類有MesosSchedulerBackend和TaskSchedulerImpl類。CoarseMesosSchedulerBackend和 MesosSchedulerBackend都繼承了MScheduler(實際上是Mesos的Scheduler),便於註冊到Mesos資源調度的框架中。選擇哪一種模式能夠經過spark.mesos.coarse參數配置。默認的是MesosSchedulerBackend。

  上面涉及到Spark的許多部署模式,究竟哪一種模式好這個很難說,須要根據你的需求,若是你只是測試Spark Application,你能夠選擇local模式。而若是你數據量不是不少,Standalone 是個不錯的選擇。當你須要統一管理集羣資源(Hadoop、Spark等)那麼你能夠選擇Yarn,可是這樣維護成本就會變高。   yarn-cluster和yarn-client模式內部實現仍是有很大的區別。若是你須要用於生產環境,那麼請選擇yarn-cluster;而若是你僅僅是Debug程序,能夠選擇yarn-client。
相關文章
相關標籤/搜索