diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java index a354e40..a5a9a67 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java @@ -375,9 +375,18 @@ public class SimpleLoadBalancer extends BaseLoadBalancer { } // If we still have regions to dish out, assign underloaded to max - if (0 < regionsToMove.size()) { + /**HBASE-17969 + * When reaching this point, all regionserver should have at least + * min regions. If we still use serversByLoad's order(ordered by load + * and then severname, see {@link ServerAndLoad.compareTo()}). + * Then servers with smaller servername will have bigger possibility + * to get the remain regions. So here we need shuffle the regionservers + * to assign the remain regions. + */ + if(0 < regionsToMove.size()) { + List serversWithLessLoad = new ArrayList(); for (Map.Entry> server : - serversByLoad.entrySet()) { + serversByLoad.entrySet()) { int regionCount = server.getKey().getLoad(); BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName()); if(balanceInfo != null) { @@ -386,8 +395,12 @@ public class SimpleLoadBalancer extends BaseLoadBalancer { if(regionCount >= max) { break; } - addRegionPlan(regionsToMove, fetchFromTail, - server.getKey().getServerName(), regionsToReturn); + serversWithLessLoad.add(server.getKey().getServerName()); + } + //shuffle the less loaded server + Collections.shuffle(serversWithLessLoad, RANDOM); + for(ServerName serverName : serversWithLessLoad) { + addRegionPlan(regionsToMove, fetchFromTail, serverName, regionsToReturn); if (regionsToMove.isEmpty()) { break; }