You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2012/04/14 04:47:13 UTC

svn commit: r1326047 - in /hbase/branches/0.89-fb/src/main: java/org/apache/hadoop/hbase/master/ resources/hbase-webapps/master/

Author: mbautin
Date: Sat Apr 14 02:47:13 2012
New Revision: 1326047

URL: http://svn.apache.org/viewvc?rev=1326047&view=rev
Log:
[master] An easy interface to customize the region assignment plan

Summary:
The diff provides an easy interface to check and customize the region assignment plan from the web ui directly.
Here is the example:
http://msgstorectrl341.snc4.facebook.com:60010/assignmentPlan.jsp

User can easily check the current assignment plan and update any customized favored nodes.

Test Plan: Tested in migrate 002 cluster

Reviewers: kannan, kranganathan

Reviewed By: kannan

CC: hbase-eng@, hbase-ops@lists

Differential Revision: https://phabricator.fb.com/D448467

Task ID: 1018371

Added:
    hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/assignmentPlan.jsp
Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/AssignmentPlan.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionAssignmentSnapshot.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionPlacement.java
    hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/master.jsp

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/AssignmentPlan.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/AssignmentPlan.java?rev=1326047&r1=1326046&r2=1326047&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/AssignmentPlan.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/AssignmentPlan.java Sat Apr 14 02:47:13 2012
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -63,7 +64,7 @@ public class AssignmentPlan implements W
   };
 
   public AssignmentPlan() {
-    assignmentMap = new HashMap<HRegionInfo, List<HServerAddress>>();
+    assignmentMap = new TreeMap<HRegionInfo, List<HServerAddress>>();
     assignmentUpdateTS = new HashMap<HRegionInfo, Long>();
   }
 

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionAssignmentSnapshot.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionAssignmentSnapshot.java?rev=1326047&r1=1326046&r2=1326047&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionAssignmentSnapshot.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionAssignmentSnapshot.java Sat Apr 14 02:47:13 2012
@@ -48,6 +48,9 @@ public class RegionAssignmentSnapshot {
   private final Map<String, List<HRegionInfo>> tableToRegionMap;
   /** the region to region server map */
   private final Map<HRegionInfo, HServerAddress> regionToRegionServerMap;
+  /** the region name to region info map */
+  private final Map<String, HRegionInfo> regionNameToRegionInfoMap;
+
   /** the regionServer to region map */
   private final Map<HServerAddress, List<HRegionInfo>> regionServerToRegionMap;
   /** the existing assignment plan in the META region */
@@ -60,6 +63,7 @@ public class RegionAssignmentSnapshot {
     tableToRegionMap = new HashMap<String, List<HRegionInfo>>();
     regionToRegionServerMap = new HashMap<HRegionInfo, HServerAddress>();
     regionServerToRegionMap = new HashMap<HServerAddress, List<HRegionInfo>>();
+    regionNameToRegionInfoMap = new HashMap<String, HRegionInfo>();
     exsitingAssignmentPlan = new AssignmentPlan();
     globalAssignmentDomain = new AssignmentDomain(conf);
   }
@@ -125,6 +129,9 @@ public class RegionAssignmentSnapshot {
   private void addRegion(HRegionInfo regionInfo) {
     if (regionInfo == null)
       return;
+    // Process the region name to region info map
+    regionNameToRegionInfoMap.put(regionInfo.getRegionNameAsString(), regionInfo);
+
     // Process the table to region map
     String tableName = regionInfo.getTableDesc().getNameAsString();
     List<HRegionInfo> regionList = tableToRegionMap.get(tableName);
@@ -151,6 +158,10 @@ public class RegionAssignmentSnapshot {
     }
   }
 
+  public Map<String, HRegionInfo> getRegionNameToRegionInfoMap() {
+    return this.regionNameToRegionInfoMap;
+  }
+
   public Map<String, List<HRegionInfo>> getTableToRegionMap() {
     return tableToRegionMap;
   }

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionPlacement.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionPlacement.java?rev=1326047&r1=1326046&r2=1326047&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionPlacement.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/RegionPlacement.java Sat Apr 14 02:47:13 2012
@@ -760,6 +760,14 @@ public class RegionPlacement implements 
    */
   public static List<HServerAddress> getFavoredNodesList(byte[] favoredNodes) {
     String favoredNodesStr = Bytes.toString(favoredNodes);
+    return getFavoredNodeList(favoredNodesStr);
+  }
+
+  /**
+   * @param favoredNodes The Stromg of favored nodes
+   * @return the list of HServerAddress for the byte array of favored nodes.
+   */
+  public static List<HServerAddress> getFavoredNodeList(String favoredNodesStr) {
     String[] favoredNodesArray = StringUtils.split(favoredNodesStr, ",");
     if (favoredNodesArray == null)
       return null;
@@ -770,7 +778,6 @@ public class RegionPlacement implements 
     }
     return serverList;
   }
-
   /**
    * @param favoredNodes The byte array of the favored nodes
    * @return string the favoredNodes generated by the byte array of favored nodes.
@@ -910,7 +917,7 @@ public class RegionPlacement implements 
    * @return the new RegionAssignmentSnapshot
    * @throws IOException
    */
-  private RegionAssignmentSnapshot getRegionAssignmentSnapshot()
+  public RegionAssignmentSnapshot getRegionAssignmentSnapshot()
   throws IOException {
     RegionAssignmentSnapshot currentAssignmentShapshot =
       new RegionAssignmentSnapshot(this.conf);

Added: hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/assignmentPlan.jsp
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/assignmentPlan.jsp?rev=1326047&view=auto
==============================================================================
--- hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/assignmentPlan.jsp (added)
+++ hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/assignmentPlan.jsp Sat Apr 14 02:47:13 2012
@@ -0,0 +1,150 @@
+<%@ page contentType="text/html;charset=UTF-8"
+  import="java.util.*"
+  import="org.apache.hadoop.conf.Configuration"
+  import="org.apache.hadoop.hbase.util.Bytes"
+  import="org.apache.hadoop.hbase.util.JvmVersion"
+  import="org.apache.hadoop.hbase.util.FSUtils"
+  import="org.apache.hadoop.hbase.master.HMaster"
+  import="org.apache.hadoop.hbase.HConstants"
+  import="org.apache.hadoop.hbase.master.MetaRegion"
+  import="org.apache.hadoop.hbase.client.HBaseAdmin"
+  import="org.apache.hadoop.hbase.HServerInfo"
+  import="org.apache.hadoop.hbase.HServerAddress"
+  import="org.apache.hadoop.hbase.HTableDescriptor"
+  import="org.apache.hadoop.hbase.HColumnDescriptor"
+  import="org.apache.hadoop.hbase.HRegionInfo"
+  import="org.apache.hadoop.hbase.master.RegionPlacement"
+  import="org.apache.hadoop.hbase.master.RegionAssignmentSnapshot"
+  import="org.apache.hadoop.hbase.master.AssignmentPlan"
+%><%
+  HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER);
+  Configuration conf = master.getConfiguration();
+  RegionPlacement rp = new RegionPlacement(conf);
+  RegionAssignmentSnapshot snapShot = rp.getRegionAssignmentSnapshot();
+  Map<String, HRegionInfo> regionNameToRegionInfoMap = snapShot.getRegionNameToRegionInfoMap();
+
+  String regionName = request.getParameter("regionName");
+  String primaryRS = null;
+  String secondaryRS = null;
+  String tertiaryRS = null;
+  String favoredNodes = "";
+  String error = "";
+  if (regionName != null) {
+		HRegionInfo region = regionNameToRegionInfoMap.get(regionName);
+		List<HServerAddress> favoredNodesList = null;
+		if (region == null) {
+			error = " because cannot find this region in META !";
+		}	else {
+			primaryRS= request.getParameter("primaryRS");
+			favoredNodes += primaryRS + ",";
+
+			secondaryRS= request.getParameter("secondaryRS");
+			favoredNodes += secondaryRS + ",";
+
+			tertiaryRS= request.getParameter("tertiaryRS");
+			favoredNodes += tertiaryRS;
+			if (primaryRS == null || primaryRS.length() == 0 ||
+				secondaryRS == null || secondaryRS.length() == 0 ||
+				tertiaryRS == null || tertiaryRS.length() == 0 )  {
+				error = " because the favored nodes are incomplete : " + favoredNodes;
+			} else {
+				try {
+					favoredNodesList = RegionPlacement.getFavoredNodeList(favoredNodes);
+				} catch (IllegalArgumentException e) {
+					error = " because received the invalid favored nodes: " + e.toString();
+				}
+				if (favoredNodesList != null) {
+					AssignmentPlan newPlan = new AssignmentPlan();
+					newPlan.updateAssignmentPlan(region, favoredNodesList);
+					try {
+						rp.updateAssignmentPlan(newPlan);
+					} catch (Exception e) {
+						error = " because caught some exceptions during the update " + e.toString();
+					}
+				}
+			}
+		}
+		snapShot = rp.getRegionAssignmentSnapshot();
+  }
+  AssignmentPlan plan = snapShot.getExistingAssignmentPlan();
+  Map<HRegionInfo, List<HServerAddress>> assignmentMap = plan.getAssignmentMap();
+  Map<HRegionInfo, HServerAddress> currentAssignment = snapShot.getRegionToRegionServerMap();
+
+%><?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+		<title>HBase Assignment Plan</title>
+		<link rel="stylesheet" type="text/css" href="/static/hbase.css" />
+	</head>
+	<body>
+		<a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
+		<h1 id="page_title">Region Assignment Plan</h1>
+		<p id="links_menu"><a href="/master.jsp">Master</a></p>
+		<hr id="head_rule" />
+
+		<h2>Region Assignment Plan </h2>
+<%
+			if (error.length() != 0) {
+%>
+				<h3>Failed to update the favored nodes: <font color="#FF0000"><%=favoredNodes%> </font>, </h3>
+				<h3>for the region: <font color="#FF0000"> <%=regionName%> </font></h3>
+				<h3><%=error%></h3>
+<%
+			} else if (regionName != null) {
+%>
+				<h3> Succeeded to update the favored nodes: <font color="#32CD32"><%=favoredNodes%> </font>,</h3>
+				<h3> for the region: <font color="#32CD32"><%=regionName%> </font></h3>
+<%
+			}
+%>
+		<table>
+			<tr>
+			<th>Region Name</th> <th>Position</th> <th>Primary RS</th> <th>Secondary RS</th> <th>Tertiary RS</th>  <th>Actions</th>
+			</tr>
+<%				for(Map.Entry<HRegionInfo, List<HServerAddress>> entry : assignmentMap.entrySet() ) {
+					List<HServerAddress> favoredNodeList = entry.getValue();
+					favoredNodes =  RegionPlacement.getFavoredNodes(favoredNodeList);
+						regionName = entry.getKey().getRegionNameAsString();
+						HServerAddress currentRS = currentAssignment.get(entry.getKey());
+						String position = "Not Assigned";
+						AssignmentPlan.POSITION favoredNodePosition = AssignmentPlan.getFavoredServerPosition(favoredNodeList, currentRS);
+						if (favoredNodePosition == null) {
+							position = "Not on FavoredNode";
+						} else {
+							position = favoredNodePosition.toString();
+						}
+%>
+			<tr>
+				<form method="post">
+					<input type="hidden" name="regionName" value="<%= regionName %>">
+				<td><%=regionName%> </td>
+					<%
+					  if (position.startsWith("Not")) {
+					%>
+							<td><b><font color="#FF0000"><%=position%></font></b></td>
+					<%
+					} else if (position.equalsIgnoreCase(AssignmentPlan.POSITION.PRIMARY.toString())){
+					%>
+							<td><b><font color="#32CD32"><%=position%></font></b></td>
+					<%
+					} else {
+					%>
+							<td><b><font color="#FFD700"><%=position%></font></b></td>
+					<%
+					}
+					%>
+					<td><input type="text" size="40" name="primaryRS" value="<%=favoredNodeList.get(AssignmentPlan.POSITION.PRIMARY.ordinal()).getHostNameWithPort()%>"</td>
+					<td><input type="text" size="40" name="secondaryRS" value="<%=favoredNodeList.get(AssignmentPlan.POSITION.SECONDARY.ordinal()).getHostNameWithPort()%>"</td>
+					<td><input type="text" size="40" name="tertiaryRS" value="<%=favoredNodeList.get(AssignmentPlan.POSITION.TERTIARY.ordinal()).getHostNameWithPort()%>"</td>
+					<td><input type="submit" size="5" value="Update"></td>
+				</form>
+			</tr>
+<%
+				}
+%>
+		</table>
+	</body>
+</html>

Modified: hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/master.jsp
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/master.jsp?rev=1326047&r1=1326046&r2=1326047&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/master.jsp (original)
+++ hbase/branches/0.89-fb/src/main/resources/hbase-webapps/master/master.jsp Sat Apr 14 02:47:13 2012
@@ -38,7 +38,7 @@
 <body>
 <a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
 <h1 id="page_title">Master: <%=master.getMasterAddress().getHostname()%>:<%=master.getMasterAddress().getPort()%></h1>
-<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a>, <a href="/taskmonitor">Task Monitor</a>, <a href="/conf">HBase Configuration</a></p>
+<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a>, <a href="/taskmonitor">Task Monitor</a>, <a href="/conf">HBase Configuration</a> <a href="assignmentPlan.jsp">HBase Assignment Plan</a></p>
 
 <!-- Various warnings that cluster admins should be aware of -->
 <% if (JvmVersion.isBadJvmVersion()) { %>