Yarn源码之ApplicationClientProtocol

2021-10-17 20:53:29 浏览数 (1)

导语

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接受任务处理

然后就完成了任务的提交了

0 人点赞