Hadoop自带的hadoop-sls只能用于压测调度器,可在实际中影响ResourceManager性能的因素比较多,不能只看调度器。当前项目可构造海量的Fake NM节点,用于模拟线上RM的巨大压力场景,进行优化。首先需要对NM进行仿真。
仿真NodeManager里面的主要功能如下:
向RM注册NM,主要是调用ResourceTracker的registerNodeManager函数,主要需要下面信息:
核心代码如下:
private void registerNodeManager() throws YarnException, IOException {
RegisterNodeManagerRequest request = recordFactory.newRecordInstance(RegisterNodeManagerRequest.class);
request.setHttpPort(httpPort);
request.setResource(capability);
request.setPhysicalResource(capability);
request.setNodeId(this.nodeId);
request.setNMVersion(YarnVersionInfo.getVersion());
LOG.info("begin register NodeManager {} capacity={}, available={}, used={}", nodeId, this.capability, this.available, this.used);
RegisterNodeManagerResponse response = resourceTracker.registerNodeManager(request);
nmTokenMasterKey = response.getNMTokenMasterKey();
LOG.info("Register NodeManager {} success", nodeId);
}
根据当前Fake的主机名和rpc端口初始化rpc服务,主要实现ContainerManagementProtocol协议。
private void initRpcServer(YarnConfiguration config, int port, String hostName) {
YarnRPC rpc = YarnRPC.create(config);
InetSocketAddress addr = NetUtils.createSocketAddr(hostName + ":" + port);
NMTokenSecretManagerInNM tokenSecretManager = new NMTokenSecretManagerInNM();
tokenSecretManager.setMasterKey(nmTokenMasterKey);
Server server = rpc.getServer(ContainerManagementProtocol.class,
this, addr, config, tokenSecretManager, 10);
server.start();
LOG.info("Init rpc {}:{} success", hostName, port);
}
根据当前Fake的主机名和http端口初始化http服务,目前只显示NM的资源信息。
private void initHttpServer(int port, String hostName) throws IOException {
InetSocketAddress addr = NetUtils.createSocketAddr(hostName + ":" + port);
HttpServer httpServer = HttpServer.create(addr, 0);
httpServer.createContext("/", new NMHttpHandler(this));
httpServer.setExecutor(Executors.newFixedThreadPool(2));
httpServer.start();
}
NM和RM之间的心跳是NM的核心功能,主要是调用ResourceTracker的nodeHeartbeat函数,主要需要下面参数:
核心代码如下:
NodeStatus nodeStatus = createNodeStatus(nodeId, getContainerStatuses(containers));
nodeStatus.setResponseId(responseID);
NodeHeartbeatRequest request = NodeHeartbeatRequest.newInstance(nodeStatus, nmTokenMasterKey, nmTokenMasterKey,
CommonNodeLabelsManager.EMPTY_NODELABEL_SET, null, null);
request.setTokenSequenceNo(tokenSequenceNo);
request.setLastKnownNMTokenMasterKey(nmTokenMasterKey);
request.setLastKnownContainerTokenMasterKey(nmTokenMasterKey);
NodeHeartbeatResponse response = resourceTracker.nodeHeartbeat(request);
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有