原创文章,转载请注明: 转载自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的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