You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 19:42:04 UTC
svn commit: r1181920 -
/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java
Author: nspiegelberg
Date: Tue Oct 11 17:42:04 2011
New Revision: 1181920
URL: http://svn.apache.org/viewvc?rev=1181920&view=rev
Log:
HBase RegionSplitter: Split on low-loaded regions first
Summary:
Always split on low-loaded regions first. This will prevent
the load balancing slop from kicking in during rolling splits.
Test Plan: - bin/hbase RegionSplitter table -o 20
Reviewed By: kranganathan
Reviewers: kranganathan
CC: kranganathan
Differential Revision: 297100
Task ID: 510843
Modified:
hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java
Modified: hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java?rev=1181920&r1=1181919&r2=1181920&view=diff
==============================================================================
--- hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java (original)
+++ hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/loadtest/RegionSplitter.java Tue Oct 11 17:42:04 2011
@@ -4,7 +4,11 @@ import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@@ -272,10 +276,29 @@ public class RegionSplitter {
while (!daughterRegions.isEmpty()) {
LOG.debug(daughterRegions.size() + " RS have regions to splt.");
- // round-robin through the RS list
- for (HServerAddress rsLoc = daughterRegions.firstKey();
- rsLoc != null;
- rsLoc = daughterRegions.higherKey(rsLoc)) {
+ // Get RegionServer : region count mapping
+ final TreeMap<HServerAddress, Integer> rsSizes = Maps.newTreeMap();
+ Map<HRegionInfo, HServerAddress> regionsInfo = table.getRegionsInfo();
+ for (HServerAddress rs : regionsInfo.values()) {
+ if (rsSizes.containsKey(rs)) {
+ rsSizes.put(rs, rsSizes.get(rs) + 1);
+ } else {
+ rsSizes.put(rs, 1);
+ }
+ }
+
+ // sort the RS by the number of regions they have
+ List<HServerAddress> serversLeft = Lists.newArrayList(daughterRegions
+ .keySet());
+ Collections.sort(serversLeft, new Comparator<HServerAddress>() {
+ public int compare(HServerAddress o1, HServerAddress o2) {
+ return rsSizes.get(o1).compareTo(rsSizes.get(o2));
+ }
+ });
+
+ // round-robin through the RS list. Choose the lightest-loaded servers
+ // first to keep the master from load-balancing regions as we split.
+ for (HServerAddress rsLoc : serversLeft) {
Pair<BigInteger, BigInteger> dr = null;
// find a region in the RS list that hasn't been moved