spark 2.2.0源码解读(五) driver和executor之间如何通信

driver:发送任务。检测executor状态。
executor:接受任务并执行,完成task任务。给driver发送消息反馈自己状态。
driver和executor之间通信老版本有2中方法,netty和akka,新版本只有netty通信。
先说一下akka通信:
在这里插入图片描述一张图就把关系解释清楚了,akka定时给executor发送心跳,executor接受到心跳后反馈自身信息,如果driver没有收到某个节点的反馈信息,当达到一定次数都没收到反馈信息时候,driver就给executor标记死亡信息。将其移除。如果有新的节点,会把新的节点加入进来。

RegisteredExecutor 注册executor信息

 /**
    * Driver和Executor之间仍然使用Netty进行通信,在Driver端send一个LaunchTask的消息后,在Executor
    * 端会对应有一个receive方法接收消息。在下面代码中,可以看到Executor除了响应LaunchTask之外还能处理的
    * 其他事件。这些事件都继承自CoarseGrainedClusterMessage类。
    * */
  override def receive: PartialFunction[Any, Unit] = {
    // 注册Executor消息
    case RegisteredExecutor =>
      logInfo("Successfully registered with driver")
      try {
        executor = new Executor(executorId, hostname, env, userClassPath, isLocal = false)
      } catch {
        case NonFatal(e) =>
          exitExecutor(1, "Unable to create executor due to " + e.getMessage, e)
      }

executor的几种情况

 // 杀死Task事件
    case KillTask(taskId, _, interruptThread, reason) =>
      if (executor == null) {
        exitExecutor(1, "Received KillTask command but executor was null")
      } else {
        executor.killTask(taskId, interruptThread, reason)
      }

    // 停止Executor事件
    case StopExecutor =>
      stopping.set(true)
      logInfo("Driver commanded a shutdown")
      // Cannot shutdown here because an ack may need to be sent back to the caller. So send
      // a message to self to actually do the shutdown.
      self.send(Shutdown)

    // 终止事件
    case Shutdown =>
      stopping.set(true)
      new Thread("CoarseGrainedExecutorBackend-stop-executor") {
        override def run(): Unit = {
          // executor.stop() will call `SparkEnv.stop()` which waits until RpcEnv stops totally.
          // However, if `executor.stop()` runs in some thread of RpcEnv, RpcEnv won't be able to
          // stop until `executor.stop()` returns, which becomes a dead-lock (See SPARK-14180).
          // Therefore, we put this line in a new thread.
          executor.stop()
        }

DisassociatedEvent 当driver和executor有一方退出时,会做的反映

 /**
    * 1.5 版本 推出的时候,Application只记得跟Executor打招呼,却忘记了Master。
    * 但是:Akka的通讯机制保证当互相通讯的任意一方异常退出,另外一方都会收到DisassociatedEvent。
    *     case DisassociatedEvent
    *
    */
  override def onDisconnected(remoteAddress: RpcAddress): Unit = {
    if (stopping.get()) {
      logInfo(s"Driver from $remoteAddress disconnected during shutdown")
    } else if (driver.exists(_.address == remoteAddress)) {
      exitExecutor(1, s"Driver $remoteAddress disassociated! Shutting down.", null,
        notifyDriver = false)
    } else {
      logWarning(s"An unknown ($remoteAddress) driver disconnected.")
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值