HBASE-20186 Improve RSGroupBasedLoadBalancer#balanceCluster() to be more efficient when calculating cluster state for each rsgroup

Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
Xiang LI 2018-03-14 01:08:26 +08:00 committed by tedyu
parent 84ee32c723
commit 37342220b4
1 changed files with 13 additions and 7 deletions

View File

@ -129,17 +129,23 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
// for the regions which have been placed according to the region server group assignment // for the regions which have been placed according to the region server group assignment
// into the movement list // into the movement list
try { try {
List<RSGroupInfo> rsgi = rsGroupInfoManager.listRSGroups(); // Record which region servers have been processedso as to skip them after processed
for (RSGroupInfo info: rsgi) { HashSet<ServerName> processedServers = new HashSet<>();
// For each rsgroup
for (RSGroupInfo rsgroup : rsGroupInfoManager.listRSGroups()) {
Map<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>(); Map<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>();
Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = new HashMap<>(); Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = new HashMap<>();
for (Address sName : info.getServers()) { for (ServerName server : clusterState.keySet()) { // for each region server
for(ServerName curr: clusterState.keySet()) { if (!processedServers.contains(server) // server is not processed yet
if(curr.getAddress().equals(sName)) { && rsgroup.containsServer(server.getAddress())) { // server belongs to this rsgroup
groupClusterState.put(curr, correctedState.get(curr)); List<RegionInfo> regionsOnServer = correctedState.get(server);
} groupClusterState.put(server, regionsOnServer);
processedServers.add(server);
} }
} }
groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, groupClusterState); groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, groupClusterState);
this.internalBalancer.setClusterLoad(groupClusterLoad); this.internalBalancer.setClusterLoad(groupClusterLoad);
List<RegionPlan> groupPlans = this.internalBalancer List<RegionPlan> groupPlans = this.internalBalancer