You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by co...@apache.org on 2013/07/05 23:36:21 UTC
svn commit: r1500139 - in
/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src:
main/java/org/apache/hadoop/hdfs/server/namenode/
main/java/org/apache/hadoop/hdfs/server/namenode/metrics/
test/java/org/apache/hadoop/hdfs/server/namenode/
Author: cos
Date: Fri Jul 5 21:36:20 2013
New Revision: 1500139
URL: http://svn.apache.org/r1500139
Log:
HDFS-4860. Add additional attributes to JMX beans. Contributed by Trevor Lorimer
Modified:
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeMXBean.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java
hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=1500139&r1=1500138&r2=1500139&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Fri Jul 5 21:36:20 2013
@@ -171,6 +171,7 @@ import org.apache.hadoop.hdfs.server.com
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
import org.apache.hadoop.hdfs.server.common.Util;
import org.apache.hadoop.hdfs.server.namenode.INode.BlocksMapUpdateInfo;
+import org.apache.hadoop.hdfs.server.namenode.JournalSet.JournalAndStream;
import org.apache.hadoop.hdfs.server.namenode.LeaseManager.Lease;
import org.apache.hadoop.hdfs.server.namenode.NameNode.OperationCategory;
import org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer;
@@ -210,6 +211,7 @@ import org.apache.hadoop.security.token.
import org.apache.hadoop.security.token.delegation.DelegationKey;
import org.apache.hadoop.util.Daemon;
import org.apache.hadoop.util.DataChecksum;
+import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Time;
import org.apache.hadoop.util.VersionInfo;
import org.mortbay.util.ajax.JSON;
@@ -4993,6 +4995,28 @@ public class FSNamesystem implements Nam
}
@Override // FSNamesystemMBean
+ public int getNumDecomLiveDataNodes() {
+ final List<DatanodeDescriptor> live = new ArrayList<DatanodeDescriptor>();
+ getBlockManager().getDatanodeManager().fetchDatanodes(live, null, true);
+ int liveDecommissioned = 0;
+ for (DatanodeDescriptor node : live) {
+ liveDecommissioned += node.isDecommissioned() ? 1 : 0;
+ }
+ return liveDecommissioned;
+ }
+
+ @Override // FSNamesystemMBean
+ public int getNumDecomDeadDataNodes() {
+ final List<DatanodeDescriptor> dead = new ArrayList<DatanodeDescriptor>();
+ getBlockManager().getDatanodeManager().fetchDatanodes(dead, null, true);
+ int deadDecommissioned = 0;
+ for (DatanodeDescriptor node : dead) {
+ deadDecommissioned += node.isDecommissioned() ? 1 : 0;
+ }
+ return deadDecommissioned;
+ }
+
+ @Override // FSNamesystemMBean
@Metric({"StaleDataNodes",
"Number of datanodes marked stale due to delayed heartbeat"})
public int getNumStaleDataNodes() {
@@ -5804,6 +5828,91 @@ public class FSNamesystem implements Nam
return JSON.toString(statusMap);
}
+ @Override // NameNodeMXBean
+ public String getNodeUsage() {
+ float median = 0;
+ float max = 0;
+ float min = 0;
+ float dev = 0;
+
+ final Map<String, Map<String,Object>> info =
+ new HashMap<String, Map<String,Object>>();
+ final List<DatanodeDescriptor> live = new ArrayList<DatanodeDescriptor>();
+ blockManager.getDatanodeManager().fetchDatanodes(live, null, true);
+
+ if (live.size() > 0) {
+ float totalDfsUsed = 0;
+ float[] usages = new float[live.size()];
+ int i = 0;
+ for (DatanodeDescriptor dn : live) {
+ usages[i++] = dn.getDfsUsedPercent();
+ totalDfsUsed += dn.getDfsUsedPercent();
+ }
+ totalDfsUsed /= live.size();
+ Arrays.sort(usages);
+ median = usages[usages.length / 2];
+ max = usages[usages.length - 1];
+ min = usages[0];
+
+ for (i = 0; i < usages.length; i++) {
+ dev += (usages[i] - totalDfsUsed) * (usages[i] - totalDfsUsed);
+ }
+ dev = (float) Math.sqrt(dev / usages.length);
+ }
+
+ final Map<String, Object> innerInfo = new HashMap<String, Object>();
+ innerInfo.put("min", StringUtils.format("%.2f%%", min));
+ innerInfo.put("median", StringUtils.format("%.2f%%", median));
+ innerInfo.put("max", StringUtils.format("%.2f%%", max));
+ innerInfo.put("stdDev", StringUtils.format("%.2f%%", dev));
+ info.put("nodeUsage", innerInfo);
+
+ return JSON.toString(info);
+ }
+
+ @Override // NameNodeMXBean
+ public String getNameJournalStatus() {
+ List<Map<String, String>> jasList = new ArrayList<Map<String, String>>();
+ FSEditLog log = getFSImage().getEditLog();
+ if (log != null) {
+ boolean openForWrite = log.isOpenForWrite();
+ for (JournalAndStream jas : log.getJournals()) {
+ final Map<String, String> jasMap = new HashMap<String, String>();
+ String manager = jas.getManager().toString();
+
+ jasMap.put("required", String.valueOf(jas.isRequired()));
+ jasMap.put("disabled", String.valueOf(jas.isDisabled()));
+ jasMap.put("manager", manager);
+
+ if (jas.isDisabled()) {
+ jasMap.put("stream", "Failed");
+ } else if (openForWrite) {
+ EditLogOutputStream elos = jas.getCurrentStream();
+ if (elos != null) {
+ jasMap.put("stream", elos.generateHtmlReport());
+ } else {
+ jasMap.put("stream", "not currently writing");
+ }
+ } else {
+ jasMap.put("stream", "open for read");
+ }
+ jasList.add(jasMap);
+ }
+ }
+ return JSON.toString(jasList);
+ }
+
+ @Override // NameNodeMXBean
+ public String getNNStarted() {
+ return getStartTime().toString();
+ }
+
+ @Override // NameNodeMXBean
+ public String getCompileInfo() {
+ return VersionInfo.getDate() + " by " + VersionInfo.getUser() +
+ " from " + VersionInfo.getBranch();
+ }
+
/** @return the block manager. */
public BlockManager getBlockManager() {
return blockManager;
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeMXBean.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeMXBean.java?rev=1500139&r1=1500138&r2=1500139&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeMXBean.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeMXBean.java Fri Jul 5 21:36:20 2013
@@ -174,4 +174,32 @@ public interface NameNodeMXBean {
* @return the name dir status information, as a JSON string.
*/
public String getNameDirStatuses();
+
+ /**
+ * Get Max, Median, Min and Standard Deviation of DataNodes usage.
+ *
+ * @return the DataNode usage information, as a JSON string.
+ */
+ public String getNodeUsage();
+
+ /**
+ * Get status information about the journals of the NN.
+ *
+ * @return the name journal status information, as a JSON string.
+ */
+ public String getNameJournalStatus();
+
+ /**
+ * Gets the NN start time
+ *
+ * @return the NN start time
+ */
+ public String getNNStarted();
+
+ /**
+ * Get the compilation information which contains date, user and branch
+ *
+ * @return the compilation information, as a JSON string.
+ */
+ public String getCompileInfo();
}
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java?rev=1500139&r1=1500138&r2=1500139&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java Fri Jul 5 21:36:20 2013
@@ -118,4 +118,16 @@ public interface FSNamesystemMBean {
* @return number of stale data nodes
*/
public int getNumStaleDataNodes();
+
+ /**
+ * Number of decommissioned Live data nodes
+ * @return number of decommissioned live data nodes
+ */
+ public int getNumDecomLiveDataNodes();
+
+ /**
+ * Number of decommissioned dead data nodes
+ * @return number of decommissioned dead data nodes
+ */
+ public int getNumDecomDeadDataNodes();
}
Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java?rev=1500139&r1=1500138&r2=1500139&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java (original)
+++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java Fri Jul 5 21:36:20 2013
@@ -112,6 +112,20 @@ public class TestNameNodeMXBean {
String deadnodeinfo = (String) (mbs.getAttribute(mxbeanName,
"DeadNodes"));
assertEquals(fsn.getDeadNodes(), deadnodeinfo);
+ // get attribute NodeUsage
+ String nodeUsage = (String) (mbs.getAttribute(mxbeanName,
+ "NodeUsage"));
+ assertEquals("Bad value for NodeUsage", fsn.getNodeUsage(), nodeUsage);
+ // get attribute NameJournalStatus
+ String nameJournalStatus = (String) (mbs.getAttribute(mxbeanName,
+ "NameJournalStatus"));
+ assertEquals("Bad value for NameJournalStatus", fsn.getNameJournalStatus(), nameJournalStatus);
+ // get attribute "NNStarted"
+ String nnStarted = (String) mbs.getAttribute(mxbeanName, "NNStarted");
+ assertEquals("Bad value for NNStarted", fsn.getNNStarted(), nnStarted);
+ // get attribute "CompileInfo"
+ String compileInfo = (String) mbs.getAttribute(mxbeanName, "CompileInfo");
+ assertEquals("Bad value for CompileInfo", fsn.getCompileInfo(), compileInfo);
// get attribute NameDirStatuses
String nameDirStatuses = (String) (mbs.getAttribute(mxbeanName,
"NameDirStatuses"));