导语
yarn通过Protocol协议层来沟通接口层和核心逻辑层。
ApplicationClientProtocol协议负责的就是Client和ResourceManager的交互逻辑。主要功能是submit/abort jobs(提交/终止任务)和get information from applications(获取应用信息)以及get cluster metrics(获取集群指标)。本文将围绕主要功能展开
概述
ApplicaitionBaseProtocol
这个协议继承了ApplicaitionBaseProtocol接口,这是因为获取应用信息,获取容器信息,管理Delegation token(委托标记)这些功能是可以被其他协议复用的,所以提取出了一个base接口
抛开父接口要做的事情,ApplicationClientProtocol独属的功能就只剩下了几个
getNewApplication 获取一个新的ApplicaitonId,并获取RM当前可供分配的最大资源
submitApplication 正式提交一个应用,需要包含该应用的详细信息,例如queue,resource,containerLaunchContext等
forceKillApplication 强制杀死一个应用
getClusterMetrics 获取集群指标
getClusterNodes 获取集群节点报告
三个实现
三个实现分别位于三个层
ApplicationClientProtocolPBClientImpl,位于接口层,直接被client接口调用提供给用户
ClientRMService,位于核心逻辑层,由RM实现,包含所有的核心交互逻辑
ClientRMProtocols,位于Poxy代理交互层,用于向接口层暴露调用接口
提交任务总流程
client发出请求
client调用getNewApplication方法
rmClient其实就是协议接口,在serviceStart中被初始化
请求给到代理层
这里通过ClientRMProxy(所有RM相关的协议对象获取都会从这个代理中获取)创建了一个协议的Proxy对象,封装了协议相关的信息以及所有相关的RPC操作
这个Proxy对象实际上就是上面讲的ApplicationClientProtocolPBClientImpl实例,所以调用实际上给到了ApplicationClientProtocolPBClientImpl#getNewApplication
这个proxy对象就是真正从RPC类创建的RPC代理了,之后经过代理层的请求转发,请求就会给到RM部署的机器上
RM接受请求
这时候,请求给到了ClientRMService#getNewApplication
分配ID
RM分配了一个新的ApplicationId。根据当前的集群时间戳和一个递增的Counter作为Id
获取资源信息
然后通过YarnScheduler获取资源信息
这个请求最终是给到了ClusterNodeTracker#getMaxAllowedAllocation
可以看到,这里直接clone了configuredMaxAllocation变量,这个变量是会被YarnScheduler不断刷新的。
在CapacityScheduler#initScheduler中,初始化调度器时会第一次设置最大资源
在CapacityScheduler#reinitialize中,当调度器(不管是fifo还是fair)接受了一个新任务分配了资源后都会刷新这个最大资源参数
最后就会返回结果了
client提交任务
client完成一系列参数设置之后提交任务
请求传递的逻辑和前面是一样的,所以直接讲处理逻辑
RM接受请求
ClientRMService#submitApplication
用户权限校验
检查应用是否已经存在
防止并发请求重复创建
检查容器Token是否过期
设置队列
由RMAppMaster接受任务处理
然后就完成了任务的提交了