先看一下Worker中Driver和Executor注册过程:
Worker本身核心的作用是:管理当前机器的内存和CPU等资源,接受Master的指令来启动Driver,或者启动Executor。
如何启动Driver
如何启动Executor
如果Driver或者Executor有挂掉了,则Master就可以通过schedule再次调度资源。
Worker本身在实际运行的时候作为一个进程。实现RPC通信的。
Master通过RPC协议将消息发给Worker,Worker通过receive接收到了Master发过来的消息。
根据DriverId来具体管理DriverRunner。DriverRunner内部通过开辟线程的方式来启动了另外的一个线程。DriverRunner是Driver所在进程中Driver本身的Process。
DriverRunner:
管理Driver的执行,包括在Driver失败的时候自动重启,主要是指在standaolone模式。Worker会负责重新启动Driver。Cluster中的Driver失败的时候,如果supervise为true,则启动Driver的Worker会负责重新启动该Driver。
创建Driver的工作目录:
createWorkingDirectory(),创建Driver的工作目录
自己写的代码打成Jar包。
下载Jar文件,返回Jar在本地的路径,将程序打成JAR包上传到HDFS上,这样每台机器均可以从HDFS上下载。
有些变量在开始的时候是占位符,因为还没有初始化,所以在实际运行的时候要初始化。
command主要就是构建进程执行类的入口。
launchDriver的源码如下:将stdout和stderr重定向到了baseDir之下了,这样就可以通过log去查看之前的执行情况。
ProcessBuilderLike静态方法:
ProcessBuilderLike源码如下:
而在runCommandWithRetry方法中:
最后,如果Driver的状态有变,则会给自己发条消息。
Worker端:
给Master发消息
然后Master端receive方法是负责接收Worker发消息的。根据Driver状态进行处理。
removeDriver方法:从自己的数据结构中remove掉。
LaunchExecutor:先判断是否此时的路径是是activeMasterUrl
创建Executor的工作目录
启动ExecutorRunner
Start()方法通过fetchAndRunExecutor方法启动Executor。
fetchAndRunExecutor源码如下:
然后Worker将消息发送给Master
Master端处理的时候,还要给Driver发送消息
Worker原理内幕和流程控制如下图:
注:本学习笔记来自DT大数据梦工厂