传奇广告网站怎么做,登陆wordpress忘记密码,wordpress.主题,免费优化目录 1、概述
2、LaunchDriver
3、LaunchDriver
4、总结 1、概述 worker肯定是实现RPC通信的#xff0c;否则别人没法给你发消息。他继承的是ThreadSafeRpcEndpoint#xff0c;ThreadSafeRpcEndpoint是线程安全的#xff0c;意味着处理一条消息完成后再处理下一个消息。换…目录 1、概述
2、LaunchDriver
3、LaunchDriver
4、总结 1、概述 worker肯定是实现RPC通信的否则别人没法给你发消息。他继承的是ThreadSafeRpcEndpointThreadSafeRpcEndpoint是线程安全的意味着处理一条消息完成后再处理下一个消息。换句话说在处理下一条消息时可以看到对ThreadSafeRpcEndpoint的内部字段的更改并且ThreadSafeRpcEndpoint中的字段不需要是volatile或等效的。但是不能保证同一个线程将为不同的消息执行相同的ThreadSafeRpcEndpoint。即顺序处理消息不能同时并发处理。
Worker本身在实际运行的时候是作为一个进程他会接收master的指令有几个非常重要的指令如LaunchExecutorLaunchDriver等。这两个指令是Schedule进行资源调度Master的schedule方法中的时候发送的。
2、LaunchDriver
Worker在收到Driver发送的LaunchDriver类型的信息后。
1首先首先打印一个日志master传进来的时候肯定会告诉你driverId的然后new 一个DriverRunner然后把这个实例通过driverId交给一个HashMap数据结构val drivers new HashMap[String, DriverRunner]。key就是driverIdvalue就是DriverRunner。这个数据结构非常重要因为我们在worker上可能启动很多Executor需要根据ExecutorId管理具体的DriverRunnerDriverRunner内部通过线程的方式启动了另外一个进程所以可以简单理解DriverRunner是Driver所在进程中本身的process这个就是一个代理模式。 2管理Driver的执行包括在Driver失败的时候自动重启要是在Standalone的模式下。失败是否重试是看DriverDescription中的supervise是否为true如果指定了这个参数为truedriver在失败的时候worker会负责启动这个Driver 3构建好DriverRunner实例并且已经将其加入到drivers中后调用DriverRunner的start方法。在start方法中通过一个线程启动Driver并管理Driver线程运行的时候run方法会被执行。
在run方法中有个prepareAndRunDriver用于准备Driver需要的jar并运行Driver 4在prepareAndRunDriver方法中会创建工作目录下载jar包到本地并封装好Driver的启动Command通过buildProcessBuilder来启动Driver。
driverDesc.command这个指定他启动的时候应该运行什么类就是类的入口。driverDesc是Master远程发送过来的为CoarseGrainedExecutorBackend 进入到runDriver方法中有个initialize方法里面重定向输出和error将stout和stderr重定向到baseDir下这样就可以通过log看一下曾经执行的情况。 然后执行runCommandWithRetry在参数中会构造ProcessBuilderLike。ProcessBuilderLike在apply的时候就new ProcessBuilderLike在这里面processBuilder.start() 在runCommandWithRetry方法中会一直循环孵化出一个进程有个方法这个是阻塞的言外之意就是当他回复过来的时候估计就有问题了那就判断一下 5在prepareAndRunDriver方法中启动Driver之后如果运行出状况了出状况后会给自己发一个消息 6在这里不同的情况打印log日志最关键的是sendToMaster(driverStateChanged)发送给master。发送的类型是DriverStateChanged 7到Master方法中。master收到这个消息后就把他remove掉是从自己的内存数据结构中remove同时把这个driver曾经占用的数据还有持久化的都remove然后再次发消息给worker确认下因为发生了资源的变动再次进行schedule 8回到Worker中start之后记录耗了多少内存CPU 3、LaunchDriver
Worker在收到Driver发送的LaunchExecutor类型的信息后首先new 一个ExecutorRunner然后start。过程与启动Driver类似就不细说。 在ExecutorRunner的start方法中会通过一个线程启动Executor并管理Executor线程运行的时候run方法会被执行。 fetchAndRunExecutor方法中类似driver中创建该executor工作目录下载运行的jar开启执行application的进程executor。并向worker发送ExecutorStateChanged的事件通知 worker先向自己发送ExecutorStateChanged的消息 在start方法之后记录耗了多少内存CPU然后向master发送接收到的ExecutorStateChanged的事件通知 4、总结 driver进程就是executor进程ExecutorBackend是进程名称standalone模式下是CoarseGrainedExecutorBackend。在CoarseGrainedExecutorBackend中有我们的Executor对象本身Executor和ExecutorBackend是一对一的关系就是一个ExecutorBackend进程里面有一个Executor在Executor内部是通过线程池并发处理的方式来处理Spark提交过来的Task。
注意Executor启动之后要向我们的driver注册。