Spark源碼分析(一)-Standalone啟動過程


原創文章,轉載請注明: 轉載自http://www.cnblogs.com/tovin/p/3858065.html

 

  為了更深入的了解spark,現開始對spark源碼進行分析,本系列文章以spark 1.0.0版本源碼作為分析對象。今天主要分析下standalone部署方式的啟動過程  

  1、Spark Standalone組件

    Standalone部署方式是一種典型master-slave模式,在這種模式下主要包含三個組件:Master(Cluster Manager)、Worker(slave)、Driver(client)

    Spark cluster components

    在spark的sbin目錄中start-master.sh、start-slave.sh腳本就是用來啟動Master、Worker的

        

  2、Master啟動分析

    先看看start-master.sh腳本,里面有默認的IP、PORT值。主要調用了org.apache.spark.deploy.master.Master類

      

      在Master類中利用了Akka框架來創建Actor對象

           

     利用actorOf初始化Master對象后,就是回調Master中的preStart方法(Akka的Actor對象一旦被初始化就會回調preStart方法)

      

    preStart方法中啟動了Spark WebUI服務、MetricsSystem(流式計算相關的)服務等

      

  3、Worker啟動分析

    在start-slave.sh腳本中調用了org.apache.spark.deploy.worker.Worker類來啟動Worker進程

      

    在Worker類中同樣采用AkkaUtils來創建一個Actor 

     

    下面看看Worker的preStart方法,它的調用鏈preStart->registerWithMaster->tryRegisterAllMasters,最終調用了tryRegisterAllMasters來注冊到Master。

      actorSelection()函數連接Master,並調用了Master的RegisterWorker服務

     

 

  4、driver啟動分析

      以spark-shell啟動為例進行分析,在spark-shell中又調用了spark-submit,而在spark-submit中調用了spark-class

    執行org.apache.spark.deploy.SparkSubmit,-class參數 org.apache.spark.repl.Main

       

         

    下圖分析SparkSubmit類后續的執行過程,通過一步一步跟蹤,它最終會調用到ClientActor類。

      

     在ClientActor類的preStart方法中就會發起注冊Master,並調用了Master的RegisterApplication服務    

     

  

  5、Master-Worker-Driver交互分析

    當Worker、Driver啟動后都會向Master發送消息進行登記注冊,下圖為在啟動過程中Master、Driver、Worker之間的信息交互

      1、Master、Worker啟動后,Worker會向Master發ResisterWorker消息進行注冊登記,Master負責記錄Worker相關信息后回復RegisteredWorker消息

      2、Driver啟動會向Master發送RegisterApplication消息,登記Spark應用相關信息,Master記錄Application注冊信息后回復RegisteredApplication消息

      3、Master發送LauchDriver消息通知Worker,Driver已經啟動。Worker收到消息后會記錄Driver相關信息並回復DriverStateChanged消息

      4、Master發送LauchExecutor消息通知Worker為Application分配Executor計算資源。分配成功后Worker會發送RegisterExecutor消息告訴Driver,為Application

         分配的資源信息

      5、ExecutorAdd、ExecutorUpdated、ExecutorStateChanged消息是Master、Worker、Driver之間同步Executor最新信息。

      

    具體代碼實現中,當調用Master的服務后,Master的receive函數就負責分發與處理不同服務。

    receive里面很多case語句,就是針對不同的服務進行響應處理的

    RegisterWorker服務中創建了WorkInfo來管理Worker的連接信息

     

    RegisterApplication服務中創建了ApplicationInfo來管理Appcation的連接信息

      

    至此,分析完了Driver、Master、Worker啟動建立連接的過程,里面很多細節沒有詳細分析,大家可以自行閱讀相關代碼。

 

原創文章,轉載請注明: 轉載自http://www.cnblogs.com/tovin/p/3858065.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM