From a34824a25f513b8080d568d17f263a763c581d4c Mon Sep 17 00:00:00 2001 From: Xiang LI Date: Tue, 6 Mar 2018 18:24:44 +0800 Subject: [PATCH] HBASE-20133 Calculate correct assignment and build region movement plans for mis-placed regions in one pass --- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 58 +++++++++++----------- 1 file changed, 28 insertions(+), 30 deletions(-) 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 392cbab5ce..d6a6af3cd6 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 @@ -42,6 +42,7 @@ import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.RegionPlan; import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer; import org.apache.hadoop.hbase.net.Address; +import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.util.ReflectionUtils; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; @@ -118,14 +119,15 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { " is not online, unable to perform balance"); } - Map> correctedState = correctAssignments(clusterState); - List regionPlans = new ArrayList<>(); + // Calculate correct assignments and a list of RegionPlan for mis-placed regions + Pair>, List> correctedStateAndRegionPlans = + correctAssignments(clusterState); + Map> correctedState = correctedStateAndRegionPlans.getFirst(); + List regionPlans = correctedStateAndRegionPlans.getSecond(); - List misplacedRegions = correctedState.get(LoadBalancer.BOGUS_SERVER_NAME); - for (RegionInfo regionInfo : misplacedRegions) { - ServerName serverName = findServerForRegion(clusterState, regionInfo); - regionPlans.add(new RegionPlan(regionInfo, serverName, null)); - } + // Add RegionPlan + // for the regions which have been placed according to the region server group assignment + // into the movement list try { List rsgi = rsGroupInfoManager.listRSGroups(); for (RSGroupInfo info: rsgi) { @@ -150,6 +152,8 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { LOG.warn("Exception while balancing cluster.", exp); regionPlans.clear(); } + + // Return the whole movement list return regionPlans; } @@ -334,44 +338,38 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer { return misplacedRegions; } - private ServerName findServerForRegion( - Map> existingAssignments, RegionInfo region) { - for (Map.Entry> entry : existingAssignments.entrySet()) { - if (entry.getValue().contains(region)) { - return entry.getKey(); - } - } - - throw new IllegalStateException("Could not find server for region " - + region.getShortNameToLog()); - } - - private Map> correctAssignments( + private Pair>, List> correctAssignments( Map> existingAssignments) throws HBaseIOException{ + // To return Map> correctAssignments = new TreeMap<>(); - correctAssignments.put(LoadBalancer.BOGUS_SERVER_NAME, new LinkedList<>()); + List regionPlansForMisplacedRegions = new ArrayList<>(); + for (Map.Entry> assignments : existingAssignments.entrySet()){ - ServerName sName = assignments.getKey(); - correctAssignments.put(sName, new LinkedList<>()); + ServerName currentHostServer = assignments.getKey(); + correctAssignments.put(currentHostServer, new LinkedList<>()); List regions = assignments.getValue(); for (RegionInfo region : regions) { - RSGroupInfo info = null; + RSGroupInfo targetRSGInfo = null; try { - info = rsGroupInfoManager.getRSGroup( + targetRSGInfo = rsGroupInfoManager.getRSGroup( rsGroupInfoManager.getRSGroupOfTable(region.getTable())); } catch (IOException exp) { LOG.debug("RSGroup information null for region of table " + region.getTable(), exp); } - if ((info == null) || (!info.containsServer(sName.getAddress()))) { - correctAssignments.get(LoadBalancer.BOGUS_SERVER_NAME).add(region); - } else { - correctAssignments.get(sName).add(region); + if (targetRSGInfo == null || + !targetRSGInfo.containsServer(currentHostServer.getAddress())) { // region is mis-placed + regionPlansForMisplacedRegions.add(new RegionPlan(region, currentHostServer, null)); + } else { // region is placed as expected + correctAssignments.get(currentHostServer).add(region); } } } - return correctAssignments; + + // Return correct assignments and region movement plan for mis-placed regions together + return new Pair>, List> + (correctAssignments, regionPlansForMisplacedRegions); } @Override -- 2.14.1