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 89de13bb78d4..d3ccda4c978e 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 @@ -107,16 +107,21 @@ void setNextRegionForUnload(int nextRegionForUnload) { } @Override - public void setClusterLoad(Map>> clusterLoad){ + public void setClusterLoad(Map>> clusterLoad) { serverLoadList = new ArrayList<>(); + Map server2LoadMap = new HashMap<>(); float sum = 0; - for(Map.Entry>> clusterEntry : clusterLoad.entrySet()){ - for(Map.Entry> entry : clusterEntry.getValue().entrySet()){ - if(entry.getKey().equals(masterServerName)) continue; // we shouldn't include master as potential assignee - serverLoadList.add(new ServerAndLoad(entry.getKey(), entry.getValue().size())); - sum += entry.getValue().size(); + for (Map.Entry>> clusterEntry : clusterLoad.entrySet()) { + for (Map.Entry> entry : clusterEntry.getValue().entrySet()) { + if (entry.getKey().equals(masterServerName)) continue; // we shouldn't include master as potential assignee + int regionNum = entry.getValue().size(); + server2LoadMap.compute(entry.getKey(), (k, v) -> v == null ? regionNum : regionNum + v); + sum += regionNum; } } + server2LoadMap.forEach((k, v) -> { + serverLoadList.add(new ServerAndLoad(k, v)); + }); avgLoadOverall = sum / serverLoadList.size(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java index 0d8529bc4627..83827224c7c9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java @@ -171,20 +171,33 @@ public void testBalanceClusterOverall() throws Exception { */ @Test public void testImpactOfBalanceClusterOverall() throws Exception { + testImpactOfBalanceClusterOverall(false); + } + + @Test + public void testImpactOfBalanceClusterOverallWithClusterLoadPerTable() throws Exception { + testImpactOfBalanceClusterOverall(true); + } + + private void testImpactOfBalanceClusterOverall(boolean useClusterLoadPerTable) throws Exception { Map>> clusterLoad = new TreeMap<>(); Map> clusterServers = mockUniformClusterServers(mockUniformCluster); List clusterList = convertToList(clusterServers); clusterLoad.put(TableName.valueOf(name.getMethodName()), clusterServers); // use overall can achieve both table and cluster level balance - HashMap>> result1 = mockClusterServersWithTables(clusterServers); - loadBalancer.setClusterLoad(clusterLoad); + HashMap>> clusterLoadPerTable = mockClusterServersWithTables(clusterServers); + if (useClusterLoadPerTable) { + loadBalancer.setClusterLoad((Map)clusterLoadPerTable); + } else { + loadBalancer.setClusterLoad(clusterLoad); + } List clusterplans1 = new ArrayList(); List> regionAmountList = new ArrayList>(); - for(TreeMap> servers : result1.values()){ + for (TreeMap> servers : clusterLoadPerTable.values()) { List list = convertToList(servers); LOG.info("Mock Cluster : " + printMock(list) + " " + printStats(list)); List partialplans = loadBalancer.balanceCluster(servers); - if(partialplans != null) clusterplans1.addAll(partialplans); + if (partialplans != null) clusterplans1.addAll(partialplans); List balancedClusterPerTable = reconcile(list, partialplans, servers); LOG.info("Mock Balance : " + printMock(balancedClusterPerTable)); assertClusterAsBalanced(balancedClusterPerTable); @@ -194,6 +207,6 @@ public void testImpactOfBalanceClusterOverall() throws Exception { } } List balancedCluster1 = reconcile(clusterList, clusterplans1, clusterServers); - assertTrue(assertClusterOverallAsBalanced(balancedCluster1, result1.keySet().size())); + assertTrue(assertClusterOverallAsBalanced(balancedCluster1, clusterLoadPerTable.keySet().size())); } }