diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestRMNMInfo.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestRMNMInfo.java index 4ac1f86..0d33f55 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestRMNMInfo.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestRMNMInfo.java @@ -20,9 +20,14 @@ import java.io.File; import java.io.IOException; +import java.lang.management.ManagementFactory; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.Set; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -94,6 +99,32 @@ public static void tearDown() { } @Test + public void testRMNMInfoBeans() throws Exception { + + // Construct the query to get the beans registered for RMNMInfo + MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer(); + ObjectName query = new ObjectName("Hadoop:service=ResourceManager,name=RMNMInfo*"); + int namesSizeStart = mbsc.queryNames(query, null).size();; + + // Registration + RMNMInfo rmNMInfo = new RMNMInfo(null, null); + rmNMInfo.registerMBean(); + + // Verify the increase + Set names = mbsc.queryNames(query, null); + Assert.assertTrue("No beans be registered for RMNMInfo", + names.size() > namesSizeStart); + + // Unregistration + rmNMInfo.unregisterMBean(); + + // Verify the decrease + names = mbsc.queryNames(query, null); + Assert.assertEquals("No beans should be registered for RMNMInfo", + namesSizeStart, names.size()); + } + + @Test public void testRMNMInfo() throws Exception { if (!(new File(MiniMRYarnCluster.APPJAR)).exists()) { LOG.info("MRAppJar " + MiniMRYarnCluster.APPJAR diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java index ef4a0d4..da894b2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java @@ -25,6 +25,7 @@ import java.util.List; import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; import javax.management.StandardMBean; import org.apache.commons.logging.Log; @@ -42,6 +43,7 @@ private static final Log LOG = LogFactory.getLog(RMNMInfo.class); private RMContext rmContext; private ResourceScheduler scheduler; + private ObjectName rmNMInfoBeanName; /** * Constructor for RMNMInfo registers the bean with JMX. @@ -52,17 +54,30 @@ public RMNMInfo(RMContext rmc, ResourceScheduler sched) { this.rmContext = rmc; this.scheduler = sched; + } + + public void registerMBean() { + if (rmNMInfoBeanName != null) { + LOG.info("RMNMInfo MBean already registered- " + rmNMInfoBeanName); + return; + } - StandardMBean bean; try { - bean = new StandardMBean(this,RMNMInfoBeans.class); - MBeans.register("ResourceManager", "RMNMInfo", bean); + StandardMBean bean = new StandardMBean(this, RMNMInfoBeans.class); + rmNMInfoBeanName = MBeans.register("ResourceManager", "RMNMInfo", bean); } catch (NotCompliantMBeanException e) { - LOG.warn("Error registering RMNMInfo MBean", e); + LOG.warn("Error registering RMNMInfo MBean - " + rmNMInfoBeanName, e); } - LOG.info("Registered RMNMInfo MBean"); + LOG.info("Registered RMNMInfo MBean - " + rmNMInfoBeanName); } + public void unregisterMBean() { + if (rmNMInfoBeanName != null) { + MBeans.unregister(rmNMInfoBeanName); + LOG.info("Unregistered RMNMInfo MBean - " + rmNMInfoBeanName); + rmNMInfoBeanName = null; + } + } static class InfoMap extends LinkedHashMap { private static final long serialVersionUID = 1L; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index 82a1f64..0db842f 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -138,6 +138,7 @@ protected AMRMTokenSecretManager amRmTokenSecretManager; private Dispatcher rmDispatcher; + private RMNMInfo rmNMInfo; protected ResourceScheduler scheduler; private ClientRMService clientRM; @@ -439,7 +440,8 @@ protected void serviceInit(Configuration configuration) throws Exception { delegationTokenRenewer.setRMContext(rmContext); } - new RMNMInfo(rmContext, scheduler); + rmNMInfo = new RMNMInfo(rmContext, scheduler); + rmNMInfo.registerMBean(); super.serviceInit(conf); } @@ -511,6 +513,9 @@ protected void serviceStop() throws Exception { LOG.error("Error closing store.", e); } } + if (rmNMInfo != null) { + rmNMInfo.unregisterMBean(); + } super.serviceStop(); }