HBASE-20186 Improve RSGroupBasedLoadBalancer#balanceCluster() to be more efficient when calculating cluster state for each rsgroup
Signed-off-by: tedyu <[email protected]> Conflicts: hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9fb473c0 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9fb473c0 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9fb473c0 Branch: refs/heads/branch-1.4 Commit: 9fb473c0e0f223c7085046edeab6f3ec28d67c49 Parents: 51a35aa Author: Xiang LI <[email protected]> Authored: Wed Mar 14 01:08:26 2018 +0800 Committer: Andrew Purtell <[email protected]> Committed: Fri Mar 16 18:00:59 2018 -0700 ---------------------------------------------------------------------- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 21 ++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/9fb473c0/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 529a7e6..9f8f427 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 @@ -135,16 +135,21 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer, LoadBalanc regionPlans.add(new RegionPlan(regionInfo, null, null)); } try { - for (RSGroupInfo info : infoManager.listRSGroups()) { - Map<ServerName, List<HRegionInfo>> groupClusterState = - new HashMap<ServerName, List<HRegionInfo>>(); - for (Address addr : info.getServers()) { - for(ServerName curr: clusterState.keySet()) { - if(curr.getAddress().equals(addr)) { - groupClusterState.put(curr, correctedState.get(curr)); - } + // 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 : infoManager.listRSGroups()) { + Map<ServerName, List<HRegionInfo>> groupClusterState = new HashMap<>(); + 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<HRegionInfo> regionsOnServer = correctedState.get(server); + groupClusterState.put(server, regionsOnServer); + processedServers.add(server); } } + List<RegionPlan> groupPlans = this.internalBalancer .balanceCluster(groupClusterState); if (groupPlans != null) {
