Author: tedyu
Date: Tue Oct 30 20:08:22 2012
New Revision: 1403851
URL: http://svn.apache.org/viewvc?rev=1403851&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/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java?rev=1403851&r1=1403850&r2=1403851&view=diff
==============================================================================
---
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
(original)
+++
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java
Tue Oct 30 20:08:22 2012
@@ -269,13 +269,22 @@ public class DefaultLoadBalancer extends
fetchFromTail = false;
Map<ServerName, Integer> underloadedServers = new HashMap<ServerName,
Integer>();
+ float average = (float)numRegions / numServers; // for logging
+ 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
}
- underloadedServers.put(server.getKey().getServerName(), min -
regionCount);
+ int regionsToPut = min - regionCount;
+ if (regionsToPut == 0)
+ {
+ regionsToPut = 1;
+ maxToTake--;
+ }
+ underloadedServers.put(server.getKey().getServerName(), regionsToPut);
}
// number of servers that get new regions
int serversUnderloaded = underloadedServers.size();