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 f1b5fde5a31d..0434bb5dcb29 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 @@ -274,6 +274,20 @@ public ServerName randomAssignment(HRegionInfo region, return this.internalBalancer.randomAssignment(region, filteredServers); } + public Set
getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException { + try{ + String groupName = infoManager.getRSGroupOfTable(region.getTable()); + if (groupName == null) { + groupName = RSGroupInfo.DEFAULT_GROUP; + } + RSGroupInfo info = infoManager.getRSGroup(groupName); + Set
serversInGroup = info.getServers(); + return serversInGroup; + } catch (Exception e) { + throw new HBaseIOException("Failed to get servers ", e); + } + } + private void generateGroupMaps( List regions, List servers, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index ea016cc3870e..2fac5fe67c66 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -90,6 +90,7 @@ import org.apache.hadoop.hbase.master.handler.DisableTableHandler; import org.apache.hadoop.hbase.master.handler.EnableTableHandler; import org.apache.hadoop.hbase.master.handler.OpenedRegionHandler; +import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionStateTransition; import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos; @@ -2661,9 +2662,27 @@ public void run() { for (ServerName server : getExcludedServersForSystemTable()) { regionsShouldMove.addAll(getCarryingSystemTables(server)); } + Set
remainservers = new HashSet<>(); if (!regionsShouldMove.isEmpty()) { List plans = new ArrayList<>(); + List names = getExcludedServersForSystemTable(); for (HRegionInfo regionInfo : regionsShouldMove) { + Set
serverbygroup = balancer.getServersInDefaultOrGroup(regionInfo); + Set
excludedAddresses = getAddressFromServerName(names); + if (serverbygroup != null) { + for (Address address : serverbygroup) { + if (!excludedAddresses.contains(address) && + getAddressFromServerName(serverManager. + getOnlineServersList()).contains(address)) { + remainservers.add(address); + } + } + if (remainservers.size() == 0) { + LOG.info("The region("+regionInfo.getRegionNameAsString()+")" + + "do not need to move to RS with the highest version "); + continue; + } + } RegionPlan plan = getRegionPlan(regionInfo, true); if (regionInfo.isMetaRegion()) { // Must move meta region first. @@ -2684,7 +2703,16 @@ public void run() { }).start(); } - + public HashSet
getAddressFromServerName(List servernames) { + HashSet
addresses = new HashSet<>(); + if (servernames == null) { + return addresses; + } + for (ServerName servername : servernames) { + addresses.add(servername.getAddress()); + } + return addresses; + } /** * Unassigns the specified region. *

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java index c8121b98c22d..1f488084227e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.conf.ConfigurationObserver; @@ -31,6 +32,7 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.Stoppable; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.net.Address; /** * Makes decisions about the placement and movement of Regions across @@ -127,6 +129,14 @@ ServerName randomAssignment( HRegionInfo regionInfo, List servers ) throws HBaseIOException; + /** + * Get all the servers of this region's rs_group,and now only used in RSGroupBasedLoadBalancer + * @param region Get the servers of rsgroup in region's table + * @return Set of Address + */ + Set

getServersInDefaultOrGroup( + HRegionInfo region) throws HBaseIOException; + /** * Initialize the load balancer. Must be called after setters. * @throws HBaseIOException diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java index 32d9c6c0c4aa..0e457214137d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,6 +41,7 @@ import org.apache.hadoop.hbase.master.ServerManager; import org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta; import org.apache.hadoop.hbase.master.balancer.FavoredNodesPlan.Position; +import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.util.Pair; /** @@ -225,6 +227,11 @@ public ServerName randomAssignment(HRegionInfo regionInfo, List serv } } + @Override + public Set
getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException { + return null; + } + private Pair>, List> segregateRegionsAndAssignRegionsWithFavoredNodes(List regions, List availableServers) { 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 a354e40eeaa2..3a4bc77520f3 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 @@ -25,6 +25,7 @@ import java.util.Map; import java.util.NavigableMap; import java.util.Random; +import java.util.Set; import java.util.TreeMap; import org.apache.commons.logging.Log; @@ -38,6 +39,7 @@ import org.apache.hadoop.hbase.master.RegionPlan; import com.google.common.collect.MinMaxPriorityQueue; +import org.apache.hadoop.hbase.net.Address; /** * Makes decisions about the placement and movement of Regions across @@ -420,6 +422,11 @@ public List balanceCluster( return regionsToReturn; } + @Override + public Set
getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException { + return null; + } + /** * Add a region from the head or tail to the List of regions to return. */ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index b0a9dd0e602d..3a7bc703c262 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -30,12 +30,14 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Random; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.ClusterStatus; +import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; @@ -51,8 +53,11 @@ import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.LocalityType; import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction; import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction; +import org.apache.hadoop.hbase.net.Address; + import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; + import com.google.common.base.Optional; /** @@ -463,6 +468,11 @@ public synchronized List balanceCluster(Map getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException { + return null; + } + /** * update costs to JMX */ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java index 2823d649ce6a..cb2aaf0158f9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java @@ -38,6 +38,7 @@ import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; @@ -106,6 +107,11 @@ public List balanceCluster(Map> cluste return null; } + @Override + public Set
getServersInDefaultOrGroup(HRegionInfo region) throws HBaseIOException { + return null; + } + @Override public List balanceCluster(TableName tableName, Map> clusterState) throws HBaseIOException {