Flink源码系列——TaskManager处理SubmitTask的过程

本文深入分析Flink TaskManager接收SubmitTask消息后的处理流程,包括任务引导、相关注册、用户代码初始化、真正执行及结尾阶段,详述TaskManager如何构建Task实例并执行任务。
摘要由CSDN通过智能技术生成

《Flink源码系列——JobManager处理SubmitJob的过程》,在从JobManager中,将SubmitTask提交到TaskManager后,继续分析TaskManager的处理逻辑。
TaskManager是个Actor,混入了LeaderSessionMessageFilter这个trait,所以在从JobManager接收到JobManagerMessages.LeaderSessionMessage[TaskMessages.SubmitTask[TaskDeploymentDescriptor]]这样的一个封装消息后,会先在LeaderSessionMessageFilter这个trait的receive方法中,进行消息的过滤,过滤逻辑如下:

abstract override def receive: Receive = {
  case leaderMessage @ LeaderSessionMessage(msgID, msg) =>
    leaderSessionID match {
      case Some(leaderId) =>
        if (leaderId.equals(msgID)) {
          super.receive(msg)
        } else {
          handleDiscardedMessage(leaderId, leaderMessage)
        }
      case None =>
        handleNoLeaderId(leaderMessage)
    }
  case msg: RequiresLeaderSessionID =>
    throw new Exception(s"Received a message $msg without a leader session ID, even though" +
      s" the message requires a leader session ID.")
  case msg =>
    super.receive(msg)
}

逻辑拆分如下:

a、接收到的是一个LeaderSessionMessage消息

a.1、当前TaskManager中有leaderSessionID

a.1.1、TaskManager所属的JobManager的sessionID和消息中的sessionID相同,则调用父类的receive方法
a.1.2、两个sessionID不同,则说明是一个过期消息,忽视该消息

a.2、当前TaskManager没有leaderSessionID,则打印个日志,不做任何处理

b、接收到的是一个RequiresLeaderSessionID消息,说明消息需要leaderSessionID,但其又没有封装在LeaderSessionMessage中,属于异常情况,抛出异常

c、其他消息,调用父类的receive方法

对于从JobManager接收到的上述消息,经过上述处理逻辑后,就变成TaskMessages.SubmitTask[TaskDeploymentDescriptor],并作为handleMessage方法的入参,SubmitTask是TaskMessage的子类,所以在handleMessage中的处理逻辑如下:

override def handleMessage: Receive = {
  ...

  case message: TaskMessage => handleTaskMessage(message)

  ...
}

然后会就进入handleTaskMessage方法,如下:

private def handleTaskMessage(message: TaskMessage): Unit = {
    ...

    case SubmitTask(tdd) => submitTask(tdd)

    ...
}

经过上述两步转化后,就会进入submitTask方法中,且入参就是TaskDeploymentDescriptor。


submitTask()方法的代码很长,但是逻辑不复杂,分块说明如下:

/** 获取当前JobManager的actor */
val jobManagerActor = currentJobManager match {
  case Some(jm) => jm
  case None =>
    throw new IllegalStateException("TaskManager is not associated with a JobManager.")
}

/** 获取library缓存管理器 */
val libCache = libraryCacheManager match {
  case Some(manager) => manager
  case None => throw new IllegalStateException("There is no valid library cache manager.")
}

/** 获取blobCache */
val blobCache = this.blobCache match {
  case Some(manager) => manager
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值