You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/05/28 07:58:31 UTC
[hbase] branch master updated: HBASE-25931 Move FavoredNodeManager
to hbase-balancer module (#3324)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 7218c83 HBASE-25931 Move FavoredNodeManager to hbase-balancer module (#3324)
7218c83 is described below
commit 7218c83f81d2ecd243f36ca6a8d656be65eaf4ab
Author: Duo Zhang <zh...@apache.org>
AuthorDate: Fri May 28 15:57:59 2021 +0800
HBASE-25931 Move FavoredNodeManager to hbase-balancer module (#3324)
Signed-off-by: Yulin Niu <ni...@apache.org>
Signed-off-by: Michael Stack <st...@apache.org>
---
hbase-balancer/pom.xml | 8 ++++
.../hadoop/hbase/favored/FavoredNodesManager.java | 54 ++++++++++------------
.../hbase/master/balancer/ClusterInfoProvider.java | 6 +++
.../master/balancer/DummyClusterInfoProvider.java | 9 +++-
.../master/balancer/FavoredStochasticBalancer.java | 3 +-
.../master/balancer/MasterClusterInfoProvider.java | 7 ++-
.../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 2 +-
7 files changed, 55 insertions(+), 34 deletions(-)
diff --git a/hbase-balancer/pom.xml b/hbase-balancer/pom.xml
index 461d2ef..8ba6ab1 100644
--- a/hbase-balancer/pom.xml
+++ b/hbase-balancer/pom.xml
@@ -89,6 +89,14 @@
<artifactId>hbase-client</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdfs-client</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hadoop</groupId>
+ <artifactId>hadoop-hdfs</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
similarity index 88%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
rename to hbase-balancer/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
index 16f0934..07ff800 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesManager.java
@@ -23,6 +23,7 @@ import static org.apache.hadoop.hbase.favored.FavoredNodesPlan.Position.PRIMARY;
import static org.apache.hadoop.hbase.favored.FavoredNodesPlan.Position.SECONDARY;
import static org.apache.hadoop.hbase.favored.FavoredNodesPlan.Position.TERTIARY;
+import com.google.errorprone.annotations.RestrictedApi;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@@ -34,9 +35,8 @@ import java.util.stream.Collectors;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.client.RegionInfo;
-import org.apache.hadoop.hbase.master.MasterServices;
-import org.apache.hadoop.hbase.master.RackManager;
import org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta;
+import org.apache.hadoop.hbase.master.balancer.ClusterInfoProvider;
import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.net.NetUtils;
@@ -49,17 +49,18 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Maps;
import org.apache.hbase.thirdparty.com.google.common.collect.Sets;
/**
- * FavoredNodesManager is responsible for maintaining favored nodes info in internal cache and
- * META table. Its the centralized store for all favored nodes information. All reads and updates
- * should be done through this class. There should only be one instance of
- * {@link FavoredNodesManager} in Master. {@link FavoredNodesPlan} and favored node information
- * from {@link SnapshotOfRegionAssignmentFromMeta} should not be used outside this class (except
- * for tools that only read or fortest cases). All other classes including Favored balancers
- * and {@link FavoredNodeAssignmentHelper} should use {@link FavoredNodesManager} for any
+ * FavoredNodesManager is responsible for maintaining favored nodes info in internal cache and META
+ * table. Its the centralized store for all favored nodes information. All reads and updates should
+ * be done through this class. There should only be one instance of {@link FavoredNodesManager} in
+ * Master. {@link FavoredNodesPlan} and favored node information from
+ * {@link SnapshotOfRegionAssignmentFromMeta} should not be used outside this class (except for
+ * tools that only read or fortest cases). All other classes including Favored balancers and
+ * {@link FavoredNodeAssignmentHelper} should use {@link FavoredNodesManager} for any
* read/write/deletes to favored nodes.
*/
@InterfaceAudience.Private
public class FavoredNodesManager {
+
private static final Logger LOG = LoggerFactory.getLogger(FavoredNodesManager.class);
private final FavoredNodesPlan globalFavoredNodesAssignmentPlan;
@@ -67,21 +68,19 @@ public class FavoredNodesManager {
private final Map<ServerName, List<RegionInfo>> secondaryRSToRegionMap;
private final Map<ServerName, List<RegionInfo>> teritiaryRSToRegionMap;
- private final MasterServices masterServices;
- private final RackManager rackManager;
+ private final ClusterInfoProvider provider;
/**
* Datanode port to be used for Favored Nodes.
*/
private int datanodeDataTransferPort;
- public FavoredNodesManager(MasterServices masterServices) {
- this.masterServices = masterServices;
+ public FavoredNodesManager(ClusterInfoProvider provider) {
+ this.provider = provider;
this.globalFavoredNodesAssignmentPlan = new FavoredNodesPlan();
this.primaryRSToRegionMap = new HashMap<>();
this.secondaryRSToRegionMap = new HashMap<>();
this.teritiaryRSToRegionMap = new HashMap<>();
- this.rackManager = new RackManager(masterServices.getConfiguration());
}
public synchronized void initialize(SnapshotOfRegionAssignmentFromMeta snapshot) {
@@ -96,10 +95,12 @@ public class FavoredNodesManager {
datanodeDataTransferPort= getDataNodePort();
}
+ @RestrictedApi(explanation = "Should only be called in tests", link = "",
+ allowedOnPath = ".*(/src/test/.*|FavoredNodesManager).java")
public int getDataNodePort() {
HdfsConfiguration.init();
- Configuration dnConf = new HdfsConfiguration(masterServices.getConfiguration());
+ Configuration dnConf = new HdfsConfiguration(provider.getConfiguration());
int dnPort = NetUtils.createSocketAddr(
dnConf.get(DFSConfigKeys.DFS_DATANODE_ADDRESS_KEY,
@@ -112,7 +113,7 @@ public class FavoredNodesManager {
return this.globalFavoredNodesAssignmentPlan.getFavoredNodes(regionInfo);
}
- /*
+ /**
* Favored nodes are not applicable for system tables. We will use this to check before
* we apply any favored nodes logic on a region.
*/
@@ -128,7 +129,7 @@ public class FavoredNodesManager {
return regions.stream().filter(r -> !isFavoredNodeApplicable(r)).collect(Collectors.toSet());
}
- /*
+ /**
* This should only be used when sending FN information to the region servers. Instead of
* sending the region server port, we use the datanode port. This helps in centralizing the DN
* port logic in Master. The RS uses the port from the favored node list as hints.
@@ -148,7 +149,6 @@ public class FavoredNodesManager {
public synchronized void updateFavoredNodes(Map<RegionInfo, List<ServerName>> regionFNMap)
throws IOException {
-
Map<RegionInfo, List<ServerName>> regionToFavoredNodes = new HashMap<>();
for (Map.Entry<RegionInfo, List<ServerName>> entry : regionFNMap.entrySet()) {
RegionInfo regionInfo = entry.getKey();
@@ -187,7 +187,7 @@ public class FavoredNodesManager {
// Lets do a bulk update to meta since that reduces the RPC's
FavoredNodeAssignmentHelper.updateMetaWithFavoredNodesInfo(regionToFavoredNodes,
- masterServices.getConnection());
+ provider.getConnection());
deleteFavoredNodesForRegions(regionToFavoredNodes.keySet());
for (Map.Entry<RegionInfo, List<ServerName>> entry : regionToFavoredNodes.entrySet()) {
@@ -227,13 +227,13 @@ public class FavoredNodesManager {
teritiaryRSToRegionMap.put(serverToUse, regionList);
}
- /*
+ /**
* Get the replica count for the servers provided.
- *
- * For each server, replica count includes three counts for primary, secondary and tertiary.
- * If a server is the primary favored node for 10 regions, secondary for 5 and tertiary
- * for 1, then the list would be [10, 5, 1]. If the server is newly added to the cluster is
- * not a favored node for any region, the replica count would be [0, 0, 0].
+ * <p/>
+ * For each server, replica count includes three counts for primary, secondary and tertiary. If a
+ * server is the primary favored node for 10 regions, secondary for 5 and tertiary for 1, then the
+ * list would be [10, 5, 1]. If the server is newly added to the cluster is not a favored node for
+ * any region, the replica count would be [0, 0, 0].
*/
public synchronized Map<ServerName, List<Integer>> getReplicaLoad(List<ServerName> servers) {
Map<ServerName, List<Integer>> result = Maps.newHashMap();
@@ -297,8 +297,4 @@ public class FavoredNodesManager {
}
return regionInfos;
}
-
- public RackManager getRackManager() {
- return rackManager;
- }
}
diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterInfoProvider.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterInfoProvider.java
index 0721b7a..a380eb7 100644
--- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterInfoProvider.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/ClusterInfoProvider.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.BalancerDecision;
import org.apache.hadoop.hbase.client.BalancerRejection;
+import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.conf.ConfigurationObserver;
@@ -48,6 +49,11 @@ public interface ClusterInfoProvider extends ConfigurationObserver {
Configuration getConfiguration();
/**
+ * Returns a reference to the cluster's connection.
+ */
+ Connection getConnection();
+
+ /**
* Get all the regions of this cluster.
* <p/>
* Used to refresh region block locations on HDFS.
diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/DummyClusterInfoProvider.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/DummyClusterInfoProvider.java
index 3929e6d..5ac370e 100644
--- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/DummyClusterInfoProvider.java
+++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/DummyClusterInfoProvider.java
@@ -31,12 +31,13 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.BalancerDecision;
import org.apache.hadoop.hbase.client.BalancerRejection;
+import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableDescriptor;
public class DummyClusterInfoProvider implements ClusterInfoProvider {
- private final Configuration conf;
+ private volatile Configuration conf;
public DummyClusterInfoProvider(Configuration conf) {
this.conf = conf;
@@ -48,6 +49,11 @@ public class DummyClusterInfoProvider implements ClusterInfoProvider {
}
@Override
+ public Connection getConnection() {
+ return null;
+ }
+
+ @Override
public List<RegionInfo> getAssignedRegions() {
return Collections.emptyList();
}
@@ -99,5 +105,6 @@ public class DummyClusterInfoProvider implements ClusterInfoProvider {
@Override
public void onConfigurationChange(Configuration conf) {
+ this.conf = conf;
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
index 72e65f2..f464789 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java
@@ -118,8 +118,7 @@ public class FavoredStochasticBalancer extends StochasticLoadBalancer implements
Set<RegionInfo> regionSet = new HashSet<>(regions);
Map<ServerName, List<RegionInfo>> assignmentMap = new HashMap<>();
try {
- FavoredNodeAssignmentHelper helper =
- new FavoredNodeAssignmentHelper(servers, fnm.getRackManager());
+ FavoredNodeAssignmentHelper helper = new FavoredNodeAssignmentHelper(servers, rackManager);
helper.initialize();
Set<RegionInfo> systemRegions = FavoredNodesManager.filterNonFNApplicableRegions(regionSet);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.java
index ea694cc..c061b44 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MasterClusterInfoProvider.java
@@ -33,6 +33,7 @@ import org.apache.hadoop.hbase.TableDescriptors;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.BalancerDecision;
import org.apache.hadoop.hbase.client.BalancerRejection;
+import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.master.MasterServices;
@@ -89,6 +90,11 @@ public class MasterClusterInfoProvider implements ClusterInfoProvider {
}
@Override
+ public Connection getConnection() {
+ return services.getConnection();
+ }
+
+ @Override
public List<RegionInfo> getAssignedRegions() {
AssignmentManager am = services.getAssignmentManager();
return am != null ? am.getAssignedRegions() : Collections.emptyList();
@@ -169,5 +175,4 @@ public class MasterClusterInfoProvider implements ClusterInfoProvider {
NamedQueueRecorder getNamedQueueRecorder() {
return namedQueueRecorder;
}
-
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
index a4730c8..5f8552a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java
@@ -355,7 +355,7 @@ public class RSGroupBasedLoadBalancer implements LoadBalancer {
internalBalancer.setClusterInfoProvider(provider);
// special handling for favor node balancers
if (internalBalancer instanceof FavoredNodesPromoter) {
- favoredNodesManager = new FavoredNodesManager(masterServices);
+ favoredNodesManager = new FavoredNodesManager(provider);
if (internalBalancer instanceof FavoredNodeLoadBalancer) {
((FavoredNodeLoadBalancer) internalBalancer).setMasterServices(masterServices);
}