Yarn源代码分析之旅---ResourceManager---用户交互之ResourceManagerAdministrationProtocol与AdminService

时间:2022-01-17 05:33:34

Yarn源代码分析之旅—ResourceManager—用户交互之ResourceManagerAdministrationProtocol与AdminService

AdminService的作用

AdminService为管理员提供了一套独立的服务接口,以防止大量的普通用户的请求使得管理员发送的管理命令饿死。管理员可以通过这些接口命令管理集群,比如动态更新节点列表,更新ACL列表,更新队列信息等等

AdminService的服务初始化

我们在ResourceManager.java下面可以看到,当ResourceManager启动后,AdminService会初始化并加入到ResourceManager得serverList列表。

adminService = createAdminService();
addService(adminService);
rmContext.setRMAdminService(adminService);

具体的AdminService初始化和启动会做哪些工作,可以参考AdminService.java的源代码实现。

@Override
public void serviceInit(Configuration conf) throws Exception {
if (rmContext.isHAEnabled()) {
autoFailoverEnabled = HAUtil.isAutomaticFailoverEnabled(conf);
if (autoFailoverEnabled) {
if (HAUtil.isAutomaticFailoverEmbedded(conf)) {
embeddedElector = createEmbeddedElectorService();
addIfService(embeddedElector);
}
}
}

// ResourceManager的8033端口
// ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等
// ResourceManagerAdministrationProtocol协议
masterServiceBindAddress = conf.getSocketAddr(
YarnConfiguration.RM_BIND_HOST,
YarnConfiguration.RM_ADMIN_ADDRESS,
YarnConfiguration.DEFAULT_RM_ADMIN_ADDRESS,
YarnConfiguration.DEFAULT_RM_ADMIN_PORT);

adminAcl = new AccessControlList(conf.get(
YarnConfiguration.YARN_ADMIN_ACL,
YarnConfiguration.DEFAULT_YARN_ADMIN_ACL));
rmId = conf.get(YarnConfiguration.RM_HA_ID);
super.serviceInit(conf);
}

主要的,就是构建了一个端口地址绑定,绑定了ResourceManager的8033端口(具体的可以在配置文件设置)

AdminService的服务启动

AdminService启动后,会构建一个RCP的Server端,监听来自8033接口的请求

this.server = (Server) rpc.getServer(
ResourceManagerAdministrationProtocol.class, this, masterServiceBindAddress,
conf, null,
conf.getInt(YarnConfiguration.RM_ADMIN_CLIENT_THREAD_COUNT,
YarnConfiguration.DEFAULT_RM_ADMIN_CLIENT_THREAD_COUNT));
.....
this.server.start();

Server端与Client端之间传递的协议就是ResourceManagerAdministrationProtocol

AdminService的客户端调用–RMAdminCLI

打开yarn.sh,我们可以清楚的看到如下代码:

elif [ "$COMMAND" = "rmadmin" ] ; then
CLASS='org.apache.hadoop.yarn.client.cli.RMAdminCLI'
YARN_OPTS="$YARN_OPTS $YARN_CLIENT_OPTS"

也就是说,如果是管理员命令的话,RMAdminCLI会做处理,我们找到这个类的源文件。
启动后,会执行run方法,这个方法里面会根据输入的参数,找到并执行相应的方法,比如refreshQueues,refreshNodes等等。

 ResourceManagerAdministrationProtocol adminProtocol = createAdminProtocol();
RefreshQueuesRequest request =
recordFactory.newRecordInstance(RefreshQueuesRequest.class);
adminProtocol.refreshQueues(request);

实现也比较简单,首先创建协议的代理,然后生成一个请求对象,然后调用Server端的远程方法。