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 8c01dea91aed..3dc7670d1c3d 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 @@ -136,7 +136,7 @@ public class StochasticLoadBalancer extends BaseLoadBalancer { private List candidateGenerators; private List costFunctions; // FindBugs: Wants this protected; IS2_INCONSISTENT_SYNC // To save currently configed sum of multiplier. Defaulted at 1 for cases that carry high cost - private float sumMultiplier = 1.0f; + private float sumMultiplier; // to save and report costs to JMX private double curOverallCost = 0d; private double[] tempFunctionCosts; @@ -267,10 +267,12 @@ protected void loadConf(Configuration conf) { this.namedQueueRecorder = NamedQueueRecorder.getInstance(conf); } - LOG.info("Loaded config; maxSteps=" + maxSteps + ", runMaxSteps=" + runMaxSteps + - ", stepsPerRegion=" + stepsPerRegion + - ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + ", CostFunctions=" + - Arrays.toString(getCostFunctionNames()) + " etc."); + LOG.info( + "Loaded config; maxSteps=" + maxSteps + ", runMaxSteps=" + runMaxSteps + + ", stepsPerRegion=" + stepsPerRegion + + ", maxRunningTime=" + maxRunningTime + ", isByTable=" + isByTable + + ", CostFunctions=" + Arrays.toString(getCostFunctionNames()) + + " , sum of multiplier of cost functions = " + sumMultiplier + " etc."); } @Override @@ -355,31 +357,24 @@ boolean needsBalance(TableName tableName, BalancerClusterState cluster) { return false; } if (areSomeRegionReplicasColocated(cluster)) { - LOG.info("Running balancer because at least one server hosts replicas of the same region."); + LOG.info("Running balancer because at least one server hosts replicas of the same region." + + " function cost={}", functionCost()); return true; } if (idleRegionServerExist(cluster)){ - LOG.info("Running balancer because cluster has idle server(s)."); + LOG.info("Running balancer because cluster has idle server(s)."+ + " function cost={}", functionCost()); return true; } - sumMultiplier = 0.0f; double total = 0.0; for (CostFunction c : costFunctions) { - float multiplier = c.getMultiplier(); - double cost = c.cost(); if (!c.isNeeded()) { LOG.trace("{} not needed", c.getClass().getSimpleName()); continue; } - total += cost * multiplier; - sumMultiplier += multiplier; - } - if (sumMultiplier <= 0) { - LOG.error("At least one cost function needs a multiplier > 0. For example, set " - + "hbase.master.balancer.stochastic.regionCountCost to a positive value or default"); - return false; + total += c.cost() * c.getMultiplier(); } boolean balanced = (total / sumMultiplier < minCostNeedBalance); @@ -467,6 +462,17 @@ protected List balanceTable(TableName tableName, Map 0. For example, set " + + "hbase.master.balancer.stochastic.regionCountCost to a positive value or default"); + return null; + } double currentCost = computeCost(cluster, Double.MAX_VALUE); curOverallCost = currentCost; @@ -638,8 +644,8 @@ private String functionCost() { builder.append(", "); double cost = c.cost(); builder.append("imbalance=" + cost); - if (cost < minCostNeedBalance) { - builder.append(", balanced"); + if (cost >= minCostNeedBalance) { + builder.append(", need balance"); } } else { builder.append("not needed");