YARN-2442. ResourceManager JMX UI does not give HA State. Contributed by Rohith Sharma and Cyrus Jackson.

This commit is contained in:
Abhishek Modi 2019-10-29 15:54:55 +05:30
parent fa4904cdca
commit ed45c13f67
4 changed files with 149 additions and 2 deletions

View File

@ -0,0 +1,76 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.yarn.server.resourcemanager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.metrics2.util.MBeans;
import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.security.UserGroupInformation;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.StandardMBean;
/**
* JMX bean for RM info.
*/
public class RMInfo implements RMInfoMXBean {
private static final Log LOG = LogFactory.getLog(RMNMInfo.class);
private ResourceManager resourceManager;
private ObjectName rmStatusBeanName;
/**
* Constructor for RMInfo registers the bean with JMX.
*
* @param resourceManager resource manager's context object
*/
RMInfo(ResourceManager resourceManager) {
this.resourceManager = resourceManager;
}
public void register() {
StandardMBean bean;
try {
bean = new StandardMBean(this, RMInfoMXBean.class);
rmStatusBeanName = MBeans.register("ResourceManager", "RMInfo", bean);
} catch (NotCompliantMBeanException e) {
LOG.warn("Error registering RMInfo MBean", e);
}
LOG.info("Registered RMInfo MBean");
}
public void unregister() {
if (rmStatusBeanName != null) {
MBeans.unregister(rmStatusBeanName);
}
}
@Override public String getState() {
return this.resourceManager.getRMContext().getHAServiceState().toString();
}
@Override public String getHostAndPort() {
return NetUtils.getHostPortString(ResourceManager.getBindAddress(
this.resourceManager.getRMContext().getYarnConfiguration()));
}
@Override public boolean isSecurityEnabled() {
return UserGroupInformation.isSecurityEnabled();
}
}

View File

@ -0,0 +1,42 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.yarn.server.resourcemanager;
/**
* Interface for RMInfo class.
*/
public interface RMInfoMXBean {
/**
* Gets the ResourceManager state.
* @return the ResourceManager state.
*/
String getState();
/**
* Gets the host and port colon separated.
* @return host and port colon separated.
*/
String getHostAndPort();
/**
* Gets if security is enabled.
* @return true, if security is enabled.
*/
boolean isSecurityEnabled();
}

View File

@ -256,6 +256,8 @@ public class ResourceManager extends CompositeService
return rmLoginUGI.getShortUserName();
}
private RMInfo rmStatusInfoBean;
@VisibleForTesting
protected static void setClusterTimeStamp(long timestamp) {
clusterTimeStamp = timestamp;
@ -279,6 +281,10 @@ public class ResourceManager extends CompositeService
UserGroupInformation.setConfiguration(conf);
this.rmContext = new RMContextImpl();
rmContext.setResourceManager(this);
rmContext.setYarnConfiguration(conf);
rmStatusInfoBean = new RMInfo(this);
rmStatusInfoBean.register();
// Set HA configuration should be done before login
this.rmContext.setHAEnabled(HAUtil.isHAEnabled(this.conf));
@ -341,8 +347,6 @@ public class ResourceManager extends CompositeService
}
}
rmContext.setYarnConfiguration(conf);
createAndInitActiveServices(false);
webAppAddress = WebAppUtils.getWebAppBindURL(this.conf,
@ -1422,6 +1426,7 @@ public class ResourceManager extends CompositeService
}
transitionToStandby(false);
rmContext.setHAServiceState(HAServiceState.STOPPING);
rmStatusInfoBean.unregister();
}
protected ResourceTrackerService createResourceTrackerService() {

View File

@ -23,9 +23,14 @@ import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.yarn.conf.HAUtil;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import static junit.framework.TestCase.assertNotNull;
/**
@ -66,11 +71,30 @@ public class TestRMHAMetrics {
Configuration conf = new YarnConfiguration(configuration);
MockRM rm = new MockRM(conf);
rm.init(conf);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName mxbeanName =
new ObjectName("Hadoop:service=ResourceManager,name=RMInfo");
Assert.assertEquals("initializing",
(String) mbs.getAttribute(mxbeanName, "State"));
rm.start();
Assert.assertEquals("standby",
(String) mbs.getAttribute(mxbeanName, "State"));
rm.transitionToActive();
Assert
.assertEquals("active",
(String) mbs.getAttribute(mxbeanName, "State"));
rm.transitionToStandby(true);
Assert.assertEquals("standby",
(String) mbs.getAttribute(mxbeanName, "State"));
assertNotNull(DefaultMetricsSystem.instance().getSource("JvmMetrics"));
assertNotNull(DefaultMetricsSystem.instance().getSource("UgiMetrics"));
rm.stop();
}
}