From 46e057edc0d37695632027e89af4d12818d21b3e Mon Sep 17 00:00:00 2001 From: Rohith Sharma K S Date: Tue, 6 Mar 2018 18:57:30 +0530 Subject: [PATCH] YARN-2442 --- .../hadoop/yarn/server/resourcemanager/RMInfo.java | 78 ++++++++++++++++++++++ .../yarn/server/resourcemanager/RMInfoMXBean.java | 39 +++++++++++ .../server/resourcemanager/ResourceManager.java | 8 ++- .../server/resourcemanager/TestRMHAMetrics.java | 25 +++++++ 4 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfo.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfoMXBean.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfo.java new file mode 100644 index 00000000000..e976f2855d4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfo.java @@ -0,0 +1,78 @@ +/** + * 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; + +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 RMContext rmContext; + private ObjectName rmStatusBeanName; + + /** + * Constructor for RMInfo registers the bean with JMX. + * @param context resource manager's context object + */ + RMInfo(RMContext context) { + this.rmContext = context; + } + + 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 rmContext.getHAServiceState().toString(); + } + + @Override + public String getHostAndPort() { + return NetUtils.getHostPortString( + ResourceManager.getBindAddress(rmContext.getYarnConfiguration())); + } + + @Override + public boolean isSecurityEnabled() { + return UserGroupInformation.isSecurityEnabled(); + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfoMXBean.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfoMXBean.java new file mode 100644 index 00000000000..f93f48ef80e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMInfoMXBean.java @@ -0,0 +1,39 @@ +/** + * 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; + +public interface RMInfoMXBean { + + /** + * Gets the ResourceManager state. + * @return the ResourceManager state. + */ + public String getState(); + + /** + * Gets the host and port colon separated. + * @return host and port colon separated. + */ + public String getHostAndPort(); + + /** + * Gets if security is enabled. + * @return true, if security is enabled. + */ + public boolean isSecurityEnabled(); +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index 5140c9fa558..2dfddaf578c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -222,6 +222,8 @@ public static long getClusterTimeStamp() { return clusterTimeStamp; } + private RMInfo rmStatusInfoBean; + @VisibleForTesting protected static void setClusterTimeStamp(long timestamp) { clusterTimeStamp = timestamp; @@ -244,7 +246,10 @@ protected void serviceInit(Configuration conf) throws Exception { this.conf = conf; this.rmContext = new RMContextImpl(); rmContext.setResourceManager(this); + rmContext.setYarnConfiguration(conf); + rmStatusInfoBean = new RMInfo(rmContext); + rmStatusInfoBean.register(); // add resource profiles here because it's used by AbstractYarnScheduler ResourceProfilesManager resourceProfilesManager = @@ -317,8 +322,6 @@ protected void serviceInit(Configuration conf) throws Exception { } } - rmContext.setYarnConfiguration(conf); - createAndInitActiveServices(false); webAppAddress = WebAppUtils.getWebAppBindURL(this.conf, @@ -1292,6 +1295,7 @@ protected void serviceStop() throws Exception { } transitionToStandby(false); rmContext.setHAServiceState(HAServiceState.STOPPING); + rmStatusInfoBean.unregister(); } protected ResourceTrackerService createResourceTrackerService() { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAMetrics.java index 9f57cb104fb..5361587bb20 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAMetrics.java @@ -23,9 +23,15 @@ 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.MalformedObjectNameException; +import javax.management.ObjectName; +import java.lang.management.ManagementFactory; + import static junit.framework.TestCase.assertNotNull; /** @@ -66,11 +72,30 @@ public void testMetricsAfterTransitionToStandby() throws Exception { 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(); } } -- 2.13.6 (Apple Git-96)