分享

Spark源码分析(一)-Standalone启动过程

本帖最后由 pig2 于 2014-10-4 23:42 编辑
问题导读
1.Standalone部署方式包含哪些组件?
2.driver启动包含哪些过程?
3.Worker启动调用关系是什么?




为了更深入的了解spark,现开始对spark源码进行分析,本系列文章以spark 1.0.0版本源码作为分析对象。今天主要分析下standalone部署方式的启动过程  

  1、Spark Standalone组件

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

     cluster-overview1.png

    在spark的sbin目录中start-master.sh、start-slave.sh脚本就是用来启动Master、Worker的

       下载2.png  


  2、Master启动分析
    先看看start-master.sh脚本,里面有默认的IP、PORT值。主要调用了org.apache.spark.deploy.master.Master类

     下载3.png   

      在Master类中利用了Akka框架来创建Actor对象

       下载4.png     

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

       下载5.png

    preStart方法中启动了Spark WebUI服务、MetricsSystem(流式计算相关的)服务等

       下载6.png

  3、Worker启动分析

    在start-slave.sh脚本中调用了org.apache.spark.deploy.worker.Worker类来启动Worker进程

       下载7.png

    在Worker类中同样采用AkkaUtils来创建一个Actor 

      下载8.png

    下面看看Worker的preStart方法,它的调用链preStart->registerWithMaster->tryRegisterAllMasters,最终调用了tryRegisterAllMasters来注册到Master。

      actorSelection()函数连接Master,并调用了Master的RegisterWorker服务

      下载9.png



  4、driver启动分析
      以spark-shell启动为例进行分析,在spark-shell中又调用了spark-submit,而在spark-submit中调用了spark-class
    执行org.apache.spark.deploy.SparkSubmit,-class参数 org.apache.spark.repl.Main

     下载10.png    
      下载11.png  

    下图分析SparkSubmit类后续的执行过程,通过一步一步跟踪,它最终会调用到ClientActor类。

       下载12.png

     在ClientActor类的preStart方法中就会发起注册Master,并调用了Master的RegisterApplication服务

      下载13.png

  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最新信息。

       下载14.png

    具体代码实现中,当调用Master的服务后,Master的receive函数就负责分发与处理不同服务。
    receive里面很多case语句,就是针对不同的服务进行响应处理的
    RegisterWorker服务中创建了WorkInfo来管理Worker的连接信息
      下载15.png

    RegisterApplication服务中创建了ApplicationInfo来管理Appcation的连接信息

       下载16.png

    至此,分析完了Driver、Master、Worker启动建立连接的过程,里面很多细节没有详细分析,大家可以自行阅读相关代码。


相关文章
Spark源码分析(三):TaskScheduler创建

Spark源码分析(二):SparkContext创建

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条