Prechádzať zdrojové kódy

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

Abhishek Modi 5 rokov pred
rodič
commit
ed45c13f67

+ 76 - 0
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,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();
+  }
+}

+ 42 - 0
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,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();
+}

+ 7 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java

@@ -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() {

+ 24 - 0
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,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();
   }
 }