为了账号安全,请及时绑定邮箱和手机立即绑定

Worker原理剖析

一、主要以worker启动Driver和executor为例进行Worker原理的分析

二、Driver的启动详细步骤详解

    1、worker在接收到Master的请求,请求启动Driver的时候,会调用方法LaunchDriver(driverId, driverDesc)来启动这个进程,参数表示的是Driver启动的标识以及所需要的基本信息,

  1. case LaunchDriver(driverId, driverDesc)  

    2、在LaunchDriver内部会创建一个DriverRunner对象,这个对象主要是对Driver进行管理,比如像Master发送消息等等。

  1. val driver = new DriverRunner(  

  2.         conf,  

  3.         driverId,  

  4.         workDir,  

  5.         sparkHome,  

  6.         driverDesc.copy(command = Worker.maybeUpdateSSLSettings(driverDesc.command, conf)),  

  7.         self,  

  8.         workerUri,  

  9.         securityMgr)  

    3、在线程内部会去创建工作目录下载我们的jar包

  1. //创建driver的工作目录  

  2.     val driverDir = createWorkingDirectory()  

  3.     //读取我们上传的jar文件  

  4.     val localJarFilename = downloadUserJar(driverDir)  

    4、封装Driver所需的信息,使用buildProcessBuilder启动driver

  1. //创建buildProcessBuilder  

  2.    // TODO: If we add ability to submit multiple jars they should also be added here  

  3.    val builder = CommandUtils.buildProcessBuilder(driverDesc.command, securityManager,  

  4.      driverDesc.mem, sparkHome.getAbsolutePath, substituteVariables)  

  5.   

  6.     //启动Driver  

  7.    runDriver(builder, driverDir, driverDesc.supervise)  

  5、启动完成之后会去向worker发送消息说明这个Driver的状态已经改变


  1. worker.send(DriverStateChanged(driverId, finalState.get, finalException))  

    6、整个流程的示意图:

        

三、executor的创建详解

        1、在请求启动executor的时候会去调用launchExecutor


  1.     LaunchExecutor(masterUrl, appId, execId, appDesc, cores_, memory_)  

        2、然后在创建一个executorRunner对象


  1.     //创建一个ExecutorRunner对象来管理executor  

  2.           val manager = new ExecutorRunner(  

  3.             appId,  

  4.             execId,  

  5.             appDesc.copy(command = Worker.maybeUpdateSSLSettings(appDesc.command, conf)),  

  6.             cores_,  

  7.             memory_,  

  8.             self,  

  9.             workerId,  

  10.             host,  

  11.             webUi.boundPort,  

  12.             publicAddress,  

  13.             sparkHome,  

  14.             executorDir,  

  15.             workerUri,  

  16.             conf,  

  17.             appLocalDirs, ExecutorState.RUNNING)  

        3、调用executorRunner的start()方法


  1.     manager.start()  


  1.     private[worker] def start() {  

  2.     workerThread = new Thread("ExecutorRunner for " + fullId) {  

  3.       override def run() { fetchAndRunExecutor() }  

  4.     }  

        4、调用fetchAndRunExecutor()创建ProcessBuilder       


  1.     private def fetchAndRunExecutor() {  

  2.     try {  

  3.       // Launch the process  

  4.       val builder = CommandUtils.buildProcessBuilder(appDesc.command, new SecurityManager(conf),  

  5.         memory, sparkHome.getAbsolutePath, substituteVariables)  

      5、调用start()启动executor


  1.     process = builder.start()  

       6、示意图:

            

四、总的执行流程

    

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消