spark2.11-2.3源码10_executor源码

CoarseGrainedExecutorBackend

worker中为application启动的executor,实际上是启动了这个CoarseGrainedExecutorBackend进程

首先初始化onStart

  override def onStart() {
        logInfo("Connecting to driver: " + driverUrl)
        rpcEnv.asyncSetupEndpointRefByURI(driverUrl).flatMap { ref =>
          // This is a very fast action so we can use "ThreadUtils.sameThread"
          //获取driver的进程
          driver = Some(ref)
          //向driver发送RegisterExecutor消息
          ref.ask[Boolean](RegisterExecutor(executorId, self, hostname, cores, extractLogUrls))
        }(ThreadUtils.sameThread).onComplete {
          // This is a very fast action so we can use "ThreadUtils.sameThread"
          case Success(msg) =>
            // Always receive `true`. Just ignore it
          case Failure(e) =>
            exitExecutor(1, s"Cannot register with driver: $driverUrl", e, notifyDriver = false)
        }(ThreadUtils.sameThread)
      }

返回消息在receive中

override def receive: PartialFunction[Any, Unit] = {
//driver注册executor成功之后,会发送回来RegisteredExecutor 消息,此时,CoarseGrainedExecutorBackend会创建Executor对象,作为执行句柄,其实它的大部分功能,都是通过Executor实现的
 case RegisteredExecutor =>
      logInfo("Successfully registered with driver")
      try {
      //其实它的大部分功能,都是通过Executor实现的
        executor = new Executor(executorId, hostname, env, userClassPath, isLocal = false)
      } catch {
        case NonFatal(e) =>
          exitExecutor(1, "Unable to create executor due to " + e.getMessage, e)
      }


//TaskScheduler会向executor发送LaunchTask消息,在这里接收。
//启动task
 case LaunchTask(data) =>
      if (executor == null) {
        exitExecutor(1, "Received LaunchTask command but executor was null")
      } else {
      //处理里面数据
        val taskDesc = TaskDescription.decode(data.value)
        logInfo("Got assigned task " + taskDesc.taskId)
        用内部的执行句柄,Executor的launchTask方法启动一个task
        executor.launchTask(this, taskDesc)
      }
    }

launchTask

 def launchTask(context: ExecutorBackend, taskDescription: TaskDescription): Unit = {
 	//对于每一个task,都会创建一个TaskRunner
    val tr = new TaskRunner(context, taskDescription)
    //TaskRunner放入内存缓存
    runningTasks.put(taskDescription.taskId, tr)
    //将task封装在一个线程中,丢入线程池
    threadPool.execute(tr)
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值