接《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