You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/10/30 18:44:53 UTC

svn commit: r1403801 - /hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java

Author: tedyu
Date: Tue Oct 30 17:44:53 2012
New Revision: 1403801

URL: http://svn.apache.org/viewvc?rev=1403801&view=rev
Log:
HBASE-7060 Region load balancing by table does not handle the case where a table's region count is lower than the number of the RS in the cluster (Ted Yu and Tianying)


Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java?rev=1403801&r1=1403800&r2=1403801&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/DefaultLoadBalancer.java Tue Oct 30 17:44:53 2012
@@ -229,12 +229,14 @@ public class DefaultLoadBalancer impleme
     NavigableMap<ServerAndLoad, List<HRegionInfo>> serversByLoad =
       new TreeMap<ServerAndLoad, List<HRegionInfo>>();
     int numRegions = 0;
+    int maxRegionCountPerServer = 0;
     // Iterate so we can count regions as we build the map
     for (Map.Entry<ServerName, List<HRegionInfo>> server: clusterState.entrySet()) {
       List<HRegionInfo> regions = server.getValue();
       int sz = regions.size();
       if (sz == 0) emptyRegionServerPresent = true;
       numRegions += sz;
+      if (maxRegionCountPerServer < sz) maxRegionCountPerServer = sz;
       serversByLoad.put(new ServerAndLoad(server.getKey(), sz), regions);
     }
     // Check if we even need to do any load balancing
@@ -254,6 +256,7 @@ public class DefaultLoadBalancer impleme
     }
     int min = numRegions / numServers;
     int max = numRegions % numServers == 0 ? min : min + 1;
+    if (maxRegionCountPerServer == 1) return null; // table is balanced
 
     // Using to check balance result.
     StringBuilder strBalanceParam = new StringBuilder();
@@ -315,13 +318,21 @@ public class DefaultLoadBalancer impleme
     fetchFromTail = false;
 
     Map<ServerName, Integer> underloadedServers = new HashMap<ServerName, Integer>();
+    int maxToTake = numRegions - (int)average;
     for (Map.Entry<ServerAndLoad, List<HRegionInfo>> server:
         serversByLoad.entrySet()) {
+      if (maxToTake == 0) break; // no more to take
       int regionCount = server.getKey().getLoad();
-      if (regionCount >= min) {
-        break;
+      if (regionCount >= min && regionCount > 0) {
+        continue; // look for other servers which haven't reached min
+      }
+      int regionsToPut = min - regionCount;
+      if (regionsToPut == 0)
+      {
+        regionsToPut = 1;
+        maxToTake--;
       }
-      underloadedServers.put(server.getKey().getServerName(), min - regionCount);
+      underloadedServers.put(server.getKey().getServerName(), regionsToPut);
     }
     // number of servers that get new regions
     int serversUnderloaded = underloadedServers.size();