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/21 03:31:20 UTC
svn commit: r1328559 - in /hbase/branches/0.89-fb: bin/
src/main/java/org/apache/hadoop/hbase/master/
src/main/java/org/apache/hadoop/hbase/regionserver/
Author: mbautin
Date: Sat Apr 21 01:31:19 2012
New Revision: 1328559
URL: http://svn.apache.org/viewvc?rev=1328559&view=rev
Log:
[master] A cmd line tool to customize and update the assignment plan
Summary:
D448467 (An easy interface to customize the region assignment plan) provides a web based interface to customize the assignment plan. This diff is to provide a command line tool to update the assignment plan as well.
Usage: hbase RegionPlacement -update -r region_name -f favoredNodes
For example:
hbase RegionPlacement -update -r t3,ff258b2f,1333644889988.d85269307a5ebfcc711d0f688738e748. -f msgstore312.snc4.facebook.com:60020,msgstore331.snc4.facebook.com:60020,msgstore335.snc4.facebook.com:60020
Test Plan: Tested in migration cluster
Reviewers: kannan
Reviewed By: kannan
CC: hbase-eng@, hbase-ops@lists, rthiessen
Differential Revision: https://phabricator.fb.com/D450911
Modified:
hbase/branches/0.89-fb/bin/hbase
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/RegionPlacement.java
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Modified: hbase/branches/0.89-fb/bin/hbase
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/bin/hbase?rev=1328559&r1=1328558&r2=1328559&view=diff
==============================================================================
--- hbase/branches/0.89-fb/bin/hbase (original)
+++ hbase/branches/0.89-fb/bin/hbase Sat Apr 21 01:31:19 2012
@@ -77,7 +77,7 @@ if [ $# = 0 ]; then
echo " migrate upgrade an hbase.rootdir"
echo " hbck run the hbase 'fsck' tool"
echo " localityck run the hbase locality check tool"
- echo " region_placement run the hbase region placement tool"
+ echo " RegionPlacement run the hbase region placement tool"
echo " verify [-help] verify that the cluster is working properly"
echo " or"
echo " CLASSNAME run the class named CLASSNAME"
@@ -265,7 +265,7 @@ elif [ "$COMMAND" = "hbck" ] ; then
CLASS='org.apache.hadoop.hbase.client.HBaseFsck'
elif [ "$COMMAND" = "localityck" ] ; then
CLASS='org.apache.hadoop.hbase.client.HBaseLocalityCheck'
-elif [ "$COMMAND" = "region_placement" ] ; then
+elif [ "$COMMAND" = "RegionPlacement" ] ; then
CLASS='org.apache.hadoop.hbase.master.RegionPlacement'
elif [ "$COMMAND" = "verify" ] ; then
CLASS='org.apache.hadoop.hbase.loadtest.LoadTester'
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=1328559&r1=1328558&r2=1328559&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 21 01:31:19 2012
@@ -104,6 +104,7 @@ public class AssignmentPlan implements W
this.updateAssignmentPlan(regionInfo, serverList);
}
}
+
/**
* Add an assignment to the plan
* @param region
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=1328559&r1=1328558&r2=1328559&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 21 01:31:19 2012
@@ -628,25 +628,34 @@ public class RegionPlacement implements
currentAssignment.entrySet()) {
try {
// Keep track of the favored updates for the current region server
- AssignmentPlan singleServerPlan = new AssignmentPlan();
-
+ AssignmentPlan singleServerPlan = null;
// Find out all the updates for the current region server
for (HRegionInfo region : entry.getValue()) {
List<HServerAddress> favoredServerList = plan.getAssignment(region);
- singleServerPlan.updateAssignmentPlan(region, favoredServerList);
- }
+ if (favoredServerList != null &&
+ favoredServerList.size() == HConstants.FAVORED_NODES_NUM) {
+ // Create the single server plan if necessary
+ if (singleServerPlan == null) {
+ singleServerPlan = new AssignmentPlan();
+ }
+ // Update the single server update
+ singleServerPlan.updateAssignmentPlan(region, favoredServerList);
+ }
- // Update the current region server with its updated favored nodes
- HRegionInterface currentRegionServer =
- connection.getHRegionConnection(entry.getKey());
- int updatedRegionNum =
- currentRegionServer.updateFavoredNodes(singleServerPlan);
- LOG.info("Region server " +
- currentRegionServer.getHServerInfo().getHostnamePort() +
- " has updated " + updatedRegionNum + " / " +
- singleServerPlan.getAssignmentMap().size() +
- " regions with the assignment plan");
- succeededNum ++;
+ }
+ if (singleServerPlan != null) {
+ // Update the current region server with its updated favored nodes
+ HRegionInterface currentRegionServer =
+ connection.getHRegionConnection(entry.getKey());
+ int updatedRegionNum =
+ currentRegionServer.updateFavoredNodes(singleServerPlan);
+ LOG.info("Region server " +
+ currentRegionServer.getHServerInfo().getHostnamePort() +
+ " has updated " + updatedRegionNum + " / " +
+ singleServerPlan.getAssignmentMap().size() +
+ " regions with the assignment plan");
+ succeededNum ++;
+ }
} catch (Exception e) {
failedUpdateMap.put(entry.getKey(), e);
}
@@ -821,6 +830,12 @@ public class RegionPlacement implements
opt.addOption("d", "verification-details", false,
"print the details of verification report");
+ opt.addOption("update", false,
+ "Update the favored nodes for a single region," +
+ "for example: -update -r regionName -f server1:port,server2:port,server3:port");
+ opt.addOption("r", true, "The region name that needs to be updated");
+ opt.addOption("f", true, "The new favored nodes");
+
opt.addOption("tables", true,
"The list of table names splitted by ',' ;" +
"For example: -tables: t1,t2,...,tn");
@@ -888,7 +903,33 @@ public class RegionPlacement implements
} else if (cmd.hasOption("p") || cmd.hasOption("print")) {
AssignmentPlan plan = rp.getExistingAssignmentPlan();
RegionPlacement.printAssignmentPlan(plan);
- } else {
+ } else if (cmd.hasOption("update")) {
+
+ if (!cmd.hasOption("f") || !cmd.hasOption("r")) {
+ throw new IllegalArgumentException("Please specify: " +
+ " -update -r regionName -f server1:port,server2:port,server3:port");
+ }
+
+ String regionName = cmd.getOptionValue("r");
+ String favoredNodesStr = cmd.getOptionValue("f");
+ LOG.info("Going to update the region " + regionName + " with the new favored nodes " +
+ favoredNodesStr);
+ List<HServerAddress> favoredNodes = null;
+ HRegionInfo regionInfo =
+ rp.getRegionAssignmentSnapshot().getRegionNameToRegionInfoMap().get(regionName);
+ if (regionInfo == null) {
+ LOG.error("Cannot find the region " + regionName + " from the META");
+ } else {
+ try {
+ favoredNodes = RegionPlacement.getFavoredNodeList(favoredNodesStr);
+ } catch (IllegalArgumentException e) {
+ LOG.error("Cannot parse the invalid favored nodes because " + e);
+ }
+ AssignmentPlan newPlan = new AssignmentPlan();
+ newPlan.updateAssignmentPlan(regionInfo, favoredNodes);
+ rp.updateAssignmentPlan(newPlan);
+ }
+ }else {
printHelp(opt);
}
} catch (ParseException e) {
@@ -898,8 +939,8 @@ public class RegionPlacement implements
private static void printHelp(Options opt) {
new HelpFormatter().printHelp(
- "RegionPlacement < -w | -n | -v | -t | -h >" +
- "[-l false] [-m false] [-d] [-tables t1,t2,...tn]", opt);
+ "RegionPlacement < -w | -n | -v | -t | -h | -update -r regionName -f favoredNodes >" +
+ " [-l false] [-m false] [-d] [-tables t1,t2,...tn]", opt);
}
/**
Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1328559&r1=1328558&r2=1328559&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Sat Apr 21 01:31:19 2012
@@ -84,7 +84,6 @@ import org.apache.hadoop.hbase.Leases.Le
import org.apache.hadoop.hbase.LocalHBaseCluster;
import org.apache.hadoop.hbase.NotServingRegionException;
import org.apache.hadoop.hbase.RemoteExceptionHandler;
-import org.apache.hadoop.hbase.StopStatus;
import org.apache.hadoop.hbase.Stoppable;
import org.apache.hadoop.hbase.UnknownRowLockException;
import org.apache.hadoop.hbase.UnknownScannerException;
@@ -3040,7 +3039,7 @@ public class HRegionServer implements HR
if (region == null) {
LOG.warn("Region " + entry.getKey().getRegionNameAsString() +
- " is not running on this" + this.serverInfo.getHostnamePort()
+ " is not running on this " + this.serverInfo.getHostnamePort()
+ " region server any more !");
continue;
}