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();