首页 > 大数据 > > Spark任务 Driver的注册与启动源码剖析
之前是在SparkSubmit源码剖析中,期间剖析SparkSubmit.scala通过doRunMain方法进入提交操作,提交后发生什么呢?
从提交的总体架构上来看,显示在Driver端提交,然后注册,那么提交后进入的步骤是Driver的注册于启动。直接先看Client.scala用于启动和终止Driver代码:

ClientApp来启动

接下调用了Master和Driver注册onStart方法

此时发送给master只有是注册过程,我们来看看master.scala


先判断Master状态是否为Alive,如果不为Alive,则回应提交Driver失败,需要向Alive的Master提交
否则

其中createDriver方法会把系统时间DriverID,Driver描述封装在DriverInfo对象中

然后是进入schedule调度方法
先来判断,当前master的状态,如果不是Alive,什么都不做


launchDriver(worker, driver)是干嘛的

那么以上Driver注册完成~
注册之后进入Worker.scala节点:



recieve处理worker节点方法入口,那么Driver注册进来的Worker进入的launchDriver分支源码如下:

OK进入DriverRunner的start方法看看启动做了什么



OK接着中间“prepareAndRunDriver”继续Debug进去查看

我们继续跟进runDriver方法

继续Debug下去“runCommandWithRetry”.
runCommandWithRetry是实际在系统中执行命令的操作,该操作返回process的exitCode退出码

以上Driver注册然后到Worker节点执行都结束。但是很多细节是没有阅读的,例如源码中是如何设计代码架构的,这种层层调度的代码逻辑像极了一个树形结构的思维。一个优良的代码架构应该具备解耦合和易用性,那么阅读源码带来的不仅仅是源码架构,还有个人从代码角度去理解一个架构的设计。
OK后面在继续看下Driver执行结束干了啥,主要Worker.scala在方法“handleDriverStateChanged”

DriverRunner根据退出码进行匹配,通知worker driver状态发生改变
worker接受到该消息后,做出如下操作:

Master在接受到消息后,根据匹配做出操作,如果为ERROR FINISHED KILLED FAILED状态,则调用removeDriver移除Driver

removeDriver方法中,做出一系列移除操作

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3145744/ ,如需转载,请注明出处,否则将追究法律责任。