diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index 94149a5..6d8bd48 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.TreeMap; +import java.util.NavigableMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -294,13 +295,25 @@ public abstract class BaseLoadBalancer implements LoadBalancer { } protected boolean needsBalance(ClusterLoadState cs) { + if (cs.getNumServers() == 0) { + LOG.debug("numServers=0 so skipping load balancing"); + return false; + } // Check if we even need to do any load balancing - float average = cs.getLoadAverage(); // for logging // HBASE-3681 check sloppiness first + float average = cs.getLoadAverage(); // for logging int floor = (int) Math.floor(average * (1 - slop)); int ceiling = (int) Math.ceil(average * (1 + slop)); - - return cs.getMinLoad() > ceiling || cs.getMaxLoad() < floor; + if (!(cs.getMinLoad() > ceiling || cs.getMaxLoad() < floor)) { + NavigableMap> serversByLoad = cs.getServersByLoad(); + LOG.info("Skipping load balancing because balanced cluster; " + + "servers=" + cs.getNumServers() + " " + + "regions=" + cs.getNumRegions() + " average=" + average + " " + + "mostloaded=" + serversByLoad.lastKey().getLoad() + + " leastloaded=" + serversByLoad.firstKey().getLoad()); + return false; + } + return true; } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java index fffa377..42aa6e1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/DefaultLoadBalancer.java @@ -183,29 +183,13 @@ public class DefaultLoadBalancer extends BaseLoadBalancer { boolean emptyRegionServerPresent = false; long startTime = System.currentTimeMillis(); - ClusterLoadState cs = new ClusterLoadState(clusterMap); + if (!this.needsBalance(cs)) return null; + int numServers = cs.getNumServers(); - if (numServers == 0) { - LOG.debug("numServers=0 so skipping load balancing"); - return null; - } NavigableMap> serversByLoad = cs.getServersByLoad(); - int numRegions = cs.getNumRegions(); - - if (!this.needsBalance(cs)) { - // Skipped because no server outside (min,max) range - float average = cs.getLoadAverage(); // for logging - LOG.info("Skipping load balancing because balanced cluster; " + - "servers=" + numServers + " " + - "regions=" + numRegions + " average=" + average + " " + - "mostloaded=" + serversByLoad.lastKey().getLoad() + - " leastloaded=" + serversByLoad.firstKey().getLoad()); - return null; - } - int min = numRegions / numServers; int max = numRegions % numServers == 0 ? min : min + 1; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index e907041..b958024 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -116,7 +116,7 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { // values are defaults private int maxSteps = 15000; private int stepsPerRegion = 110; - private long maxRunningTime = 1 * 60 * 1000; //5 min + private long maxRunningTime = 60 * 1000; //1 min private int maxMoves = 600; private int numRegionLoadsToRemember = 15; private float loadMultiplier = 100; @@ -179,10 +179,8 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { */ @Override public List balanceCluster(Map> clusterState) { - - // No need to balance a one node cluster. - if (clusterState.size() <= 1) { - LOG.debug("Skipping load balance as cluster has only one node."); + + if (!needsBalance(new ClusterLoadState(clusterState))) { return null; } @@ -242,7 +240,7 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { List plans = createRegionPlans(cluster); if (LOG.isDebugEnabled()) { - LOG.debug("Finished computing new laod balance plan. Computation took " + LOG.debug("Finished computing new load balance plan. Computation took " + (endTime - startTime) + "ms to try " + step + " different iterations. Found a solution that moves " + plans.size() + " regions; Going from a computed cost of " + initCost + " to a new cost of "