本帖最后由 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)
在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启动建立连接的过程,里面很多细节没有详细分析,大家可以自行阅读相关代码。
相关文章
Spark源码分析(三):TaskScheduler创建
Spark源码分析(二):SparkContext创建
|