Repository: hbase
Updated Branches:
  refs/heads/master e67eb6c42 -> edbd0e494


HBASE-17706 TableSkewCostFunction improperly computes max skew

Signed-off-by: tedyu <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/edbd0e49
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/edbd0e49
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/edbd0e49

Branch: refs/heads/master
Commit: edbd0e494d7abaf50319b7650e350d52b195fcc9
Parents: e67eb6c
Author: Kahlil Oppenheimer <[email protected]>
Authored: Tue Feb 28 00:33:57 2017 -0500
Committer: tedyu <[email protected]>
Committed: Thu Mar 16 11:57:25 2017 -0700

----------------------------------------------------------------------
 .../hbase/master/balancer/BaseLoadBalancer.java | 21 +++++++--------
 .../master/balancer/StochasticLoadBalancer.java | 19 +++++++------
 .../balancer/TestStochasticLoadBalancer.java    | 28 ++++++++++++++++++++
 3 files changed, 48 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/edbd0e49/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java
----------------------------------------------------------------------
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 b0e088c..c6086f6 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
@@ -739,18 +739,15 @@ public abstract class BaseLoadBalancer implements 
LoadBalancer {
       }
       numRegionsPerServerPerTable[newServer][tableIndex]++;
 
-      //check whether this caused maxRegionsPerTable in the new Server to be 
updated
-      if (numRegionsPerServerPerTable[newServer][tableIndex] > 
numMaxRegionsPerTable[tableIndex]) {
-        numMaxRegionsPerTable[tableIndex] = 
numRegionsPerServerPerTable[newServer][tableIndex];
-      } else if (oldServer >= 0 && 
(numRegionsPerServerPerTable[oldServer][tableIndex] + 1)
-          == numMaxRegionsPerTable[tableIndex]) {
-        //recompute maxRegionsPerTable since the previous value was coming 
from the old server
-        for (int serverIndex = 0 ; serverIndex < 
numRegionsPerServerPerTable.length; serverIndex++) {
-          if (numRegionsPerServerPerTable[serverIndex][tableIndex] > 
numMaxRegionsPerTable[tableIndex]) {
-            numMaxRegionsPerTable[tableIndex] = 
numRegionsPerServerPerTable[serverIndex][tableIndex];
-          }
-        }
-      }
+      // if old server had max num regions, assume (for now)
+      // max num regions went down since we moved the region
+      if (oldServer >= 0 &&
+          (numRegionsPerServerPerTable[oldServer][tableIndex] + 1) == 
numMaxRegionsPerTable[tableIndex]) {
+        numMaxRegionsPerTable[tableIndex]--;
+      }
+      // Now check if new server sets new max
+      numMaxRegionsPerTable[tableIndex] =
+          Math.max(numMaxRegionsPerTable[tableIndex], 
numRegionsPerServerPerTable[newServer][tableIndex]);
 
       // update for servers
       int primary = regionIndexToPrimaryIndex[region];

http://git-wip-us.apache.org/repos/asf/hbase/blob/edbd0e49/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
----------------------------------------------------------------------
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 8cbdd1e..2a3582e 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
@@ -272,14 +272,6 @@ public class StochasticLoadBalancer extends 
BaseLoadBalancer {
 
   @Override
   protected boolean needsBalance(Cluster cluster) {
-    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);
-    if (cs.getNumServers() < MIN_SERVER_BALANCE) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Not running balancer because only " + cs.getNumServers()
-            + " active regionserver(s)");
-      }
-      return false;
-    }
     if (areSomeRegionReplicasColocated(cluster)) {
       return true;
     }
@@ -306,6 +298,17 @@ public class StochasticLoadBalancer extends 
BaseLoadBalancer {
           + minCostNeedBalance);
       return false;
     }
+
+    ClusterLoadState cs = new ClusterLoadState(cluster.clusterState);
+    if (cs.getNumServers() < MIN_SERVER_BALANCE) {
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Not running balancer because only " + cs.getNumServers()
+            + " active regionserver(s)");
+      }
+      return false;
+    }
+
+
     return true;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/edbd0e49/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
index 37ff35f..081db76 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
@@ -50,6 +50,7 @@ import org.apache.hadoop.hbase.master.RegionPlan;
 import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster;
 import 
org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.CandidateGenerator;
 import 
org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TableSkewCandidateGenerator;
+import 
org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.LoadCandidateGenerator;
 import org.apache.hadoop.hbase.testclassification.FlakeyTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -238,6 +239,33 @@ public class TestStochasticLoadBalancer extends 
BalancerTestBase {
   }
 
   @Test
+  public void testTableSkewCostProperlyDecreases() {
+    int replication = 1;
+    Configuration conf = HBaseConfiguration.create();
+    StochasticLoadBalancer.CostFunction
+        costFunction = new StochasticLoadBalancer.TableSkewCostFunction(conf);
+    CandidateGenerator generator = new LoadCandidateGenerator();
+    // Start out with 100 regions on one server and 0 regions on the other
+    int numNodes = 2;
+    int numTables = 1;
+    int numRegions = 100;
+    int numRegionsPerServer = 0;
+
+    Map<ServerName, List<HRegionInfo>> serverMap = createServerMap(numNodes, 
numRegions, numRegionsPerServer, replication, numTables);
+    BaseLoadBalancer.Cluster cluster = new Cluster(serverMap, null, null, 
null);
+    costFunction.init(cluster);
+    double cost = costFunction.cost();
+    assertEquals(1.0, cost, .0001);
+    for (int i = 0; i < 100; i++) {
+      Cluster.Action action = generator.generate(cluster);
+      cluster.doAction(action);
+      costFunction.postAction(action);
+      cost = costFunction.cost();
+    }
+    assertTrue(cost < 0.5);
+  }
+
+  @Test
   public void testRegionLoadCost() {
     List<BalancerRegionLoad> regionLoads = new ArrayList<>();
     for (int i = 1; i < 5; i++) {

Reply via email to