HBASE-20186 Improve RSGroupBasedLoadBalancer#balanceCluster() to be more efficient when calculating cluster state for each rsgroup
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/03e7b782 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/03e7b782 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/03e7b782 Branch: refs/heads/branch-2 Commit: 03e7b78260413ebc508b3415dbe9c14be6a361de Parents: 3f1c867 Author: Xiang LI <[email protected]> Authored: Wed Mar 14 01:08:26 2018 +0800 Committer: Andrew Purtell <[email protected]> Committed: Fri Mar 16 18:01:01 2018 -0700 ---------------------------------------------------------------------- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/03e7b782/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java ---------------------------------------------------------------------- diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index 392cbab..3182a61 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -127,17 +127,23 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { regionPlans.add(new RegionPlan(regionInfo, serverName, null)); } try { - List<RSGroupInfo> rsgi = rsGroupInfoManager.listRSGroups(); - for (RSGroupInfo info: rsgi) { + // Record which region servers have been processedï¼so as to skip them after processed + HashSet<ServerName> processedServers = new HashSet<>(); + + // For each rsgroup + for (RSGroupInfo rsgroup : rsGroupInfoManager.listRSGroups()) { Map<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>(); Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = new HashMap<>(); - for (Address sName : info.getServers()) { - for(ServerName curr: clusterState.keySet()) { - if(curr.getAddress().equals(sName)) { - groupClusterState.put(curr, correctedState.get(curr)); - } + for (ServerName server : clusterState.keySet()) { // for each region server + if (!processedServers.contains(server) // server is not processed yet + && rsgroup.containsServer(server.getAddress())) { // server belongs to this rsgroup + List<RegionInfo> regionsOnServer = correctedState.get(server); + groupClusterState.put(server, regionsOnServer); + + processedServers.add(server); } } + groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, groupClusterState); this.internalBalancer.setClusterLoad(groupClusterLoad); List<RegionPlan> groupPlans = this.internalBalancer
