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