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

你可能感兴趣的:(spark)