Skip to content

Commit a820cfe

Browse files
Apache9thangTang
authored andcommitted
HBASE-22971 Deprecated RSGroupAdminEndpoint and make RSGroup feature always enabled (apache#595)
Signed-off-by: Guanghao Zhang <zghao@apache.org>
1 parent 897c515 commit a820cfe

33 files changed

+240
-277
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ private void addRegionToMap(Map<ServerName, List<RegionInfo>> assignmentMapForFa
321321
regionsOnServer.add(region);
322322
}
323323

324+
@Override
324325
public synchronized List<ServerName> getFavoredNodes(RegionInfo regionInfo) {
325326
return this.fnm.getFavoredNodes(regionInfo);
326327
}

hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ void generateFavoredNodesForDaughter(List<ServerName> servers,
3535

3636
void generateFavoredNodesForMergedRegion(RegionInfo merged, RegionInfo [] mergeParents)
3737
throws IOException;
38+
39+
List<ServerName> getFavoredNodes(RegionInfo regionInfo);
3840
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
import org.apache.hadoop.hbase.exceptions.DeserializationException;
9494
import org.apache.hadoop.hbase.executor.ExecutorType;
9595
import org.apache.hadoop.hbase.favored.FavoredNodesManager;
96-
import org.apache.hadoop.hbase.favored.FavoredNodesPromoter;
9796
import org.apache.hadoop.hbase.http.InfoServer;
9897
import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;
9998
import org.apache.hadoop.hbase.ipc.RpcServer;
@@ -106,7 +105,6 @@
106105
import org.apache.hadoop.hbase.master.assignment.RegionStates;
107106
import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;
108107
import org.apache.hadoop.hbase.master.balancer.BalancerChore;
109-
import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer;
110108
import org.apache.hadoop.hbase.master.balancer.ClusterStatusChore;
111109
import org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory;
112110
import org.apache.hadoop.hbase.master.cleaner.DirScanPool;
@@ -188,6 +186,7 @@
188186
import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;
189187
import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;
190188
import org.apache.hadoop.hbase.replication.regionserver.ReplicationStatus;
189+
import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
191190
import org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager;
192191
import org.apache.hadoop.hbase.security.AccessDeniedException;
193192
import org.apache.hadoop.hbase.security.SecurityConstants;
@@ -393,7 +392,7 @@ public void run() {
393392

394393
private final LockManager lockManager = new LockManager(this);
395394

396-
private LoadBalancer balancer;
395+
private RSGroupBasedLoadBalancer balancer;
397396
private RegionNormalizer normalizer;
398397
private BalancerChore balancerChore;
399398
private RegionNormalizerChore normalizerChore;
@@ -450,9 +449,6 @@ public void run() {
450449
private long splitPlanCount;
451450
private long mergePlanCount;
452451

453-
/* Handle favored nodes information */
454-
private FavoredNodesManager favoredNodesManager;
455-
456452
/** jetty server for master to redirect requests to regionserver infoServer */
457453
private Server masterJettyServer;
458454

@@ -790,7 +786,8 @@ public MetricsMaster getMasterMetrics() {
790786
@VisibleForTesting
791787
protected void initializeZKBasedSystemTrackers()
792788
throws IOException, InterruptedException, KeeperException, ReplicationException {
793-
this.balancer = LoadBalancerFactory.getLoadBalancer(conf);
789+
this.balancer = new RSGroupBasedLoadBalancer();
790+
this.balancer.setConf(conf);
794791
this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);
795792
this.normalizer.setMasterServices(this);
796793
this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);
@@ -1037,9 +1034,6 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc
10371034
return temp;
10381035
});
10391036
}
1040-
if (this.balancer instanceof FavoredNodesPromoter) {
1041-
favoredNodesManager = new FavoredNodesManager(this);
1042-
}
10431037

10441038
// initialize load balancer
10451039
this.balancer.setMasterServices(this);
@@ -1089,11 +1083,11 @@ private void finishActiveMasterInitialization(MonitoredTask status) throws IOExc
10891083
// table states messing up master launch (namespace table, etc., are not assigned).
10901084
this.assignmentManager.processOfflineRegions();
10911085
// Initialize after meta is up as below scans meta
1092-
if (favoredNodesManager != null && !maintenanceMode) {
1086+
if (getFavoredNodesManager() != null && !maintenanceMode) {
10931087
SnapshotOfRegionAssignmentFromMeta snapshotOfRegionAssignment =
10941088
new SnapshotOfRegionAssignmentFromMeta(getConnection());
10951089
snapshotOfRegionAssignment.initialize();
1096-
favoredNodesManager.initialize(snapshotOfRegionAssignment);
1090+
getFavoredNodesManager().initialize(snapshotOfRegionAssignment);
10971091
}
10981092

10991093
// set cluster status again after user regions are assigned
@@ -2055,14 +2049,13 @@ public void move(final byte[] encodedRegionName, byte[] destServerName) throws I
20552049
LOG.debug("Unable to determine a plan to assign " + hri);
20562050
return;
20572051
}
2058-
// TODO: What is this? I don't get it.
2059-
if (dest.equals(serverName) && balancer instanceof BaseLoadBalancer
2060-
&& !((BaseLoadBalancer)balancer).shouldBeOnMaster(hri)) {
2052+
// TODO: deal with table on master for rs group.
2053+
if (dest.equals(serverName)) {
20612054
// To avoid unnecessary region moving later by balancer. Don't put user
20622055
// regions on master.
2063-
LOG.debug("Skipping move of region " + hri.getRegionNameAsString()
2064-
+ " to avoid unnecessary region moving later by load balancer,"
2065-
+ " because it should not be on master");
2056+
LOG.debug("Skipping move of region " + hri.getRegionNameAsString() +
2057+
" to avoid unnecessary region moving later by load balancer," +
2058+
" because it should not be on master");
20662059
return;
20672060
}
20682061
}
@@ -3505,12 +3498,14 @@ public boolean isSplitOrMergeEnabled(MasterSwitchType switchType) {
35053498

35063499
/**
35073500
* Fetch the configured {@link LoadBalancer} class name. If none is set, a default is returned.
3508-
*
3501+
* <p/>
3502+
* Notice that, the base load balancer will always be {@link RSGroupBasedLoadBalancer} now, so
3503+
* this method will return the balancer used inside each rs group.
35093504
* @return The name of the {@link LoadBalancer} in use.
35103505
*/
35113506
public String getLoadBalancerClassName() {
3512-
return conf.get(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, LoadBalancerFactory
3513-
.getDefaultLoadBalancerClass().getName());
3507+
return conf.get(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,
3508+
LoadBalancerFactory.getDefaultLoadBalancerClass().getName());
35143509
}
35153510

35163511
/**
@@ -3525,13 +3520,13 @@ public SplitOrMergeTracker getSplitOrMergeTracker() {
35253520
}
35263521

35273522
@Override
3528-
public LoadBalancer getLoadBalancer() {
3523+
public RSGroupBasedLoadBalancer getLoadBalancer() {
35293524
return balancer;
35303525
}
35313526

35323527
@Override
35333528
public FavoredNodesManager getFavoredNodesManager() {
3534-
return favoredNodesManager;
3529+
return balancer.getFavoredNodesManager();
35353530
}
35363531

35373532
private long executePeerProcedure(AbstractPeerProcedure<?> procedure) throws IOException {
@@ -3873,7 +3868,7 @@ public MetaRegionLocationCache getMetaRegionLocationCache() {
38733868
}
38743869

38753870
@Override
3876-
public RSGroupInfoManager getRSRSGroupInfoManager() {
3871+
public RSGroupInfoManager getRSGroupInfoManager() {
38773872
return rsGroupInfoManager;
38783873
}
38793874
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObse
6464
// We deliberately use 'localhost' so the operation will fail fast
6565
ServerName BOGUS_SERVER_NAME = ServerName.valueOf("localhost,1,1");
6666

67+
/**
68+
* Config for pluggable load balancers.
69+
* @deprecated since 3.0.0, will be removed in 4.0.0. In the new implementation, as the base load
70+
* balancer will always be the rs group based one, you should just use
71+
* {@link org.apache.hadoop.hbase.HConstants#HBASE_MASTER_LOADBALANCER_CLASS} to
72+
* config the per group load balancer.
73+
*/
74+
@Deprecated
75+
String HBASE_RSGROUP_LOADBALANCER_CLASS = "hbase.rsgroup.grouploadbalancer.class";
6776
/**
6877
* Set the current cluster status. This allows a LoadBalancer to map host name to a server
6978
*/

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil.NonceProcedureRunnable;
7777
import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
7878
import org.apache.hadoop.hbase.mob.MobUtils;
79+
import org.apache.hadoop.hbase.net.Address;
7980
import org.apache.hadoop.hbase.procedure.MasterProcedureManager;
8081
import org.apache.hadoop.hbase.procedure2.LockType;
8182
import org.apache.hadoop.hbase.procedure2.LockedResource;
@@ -230,10 +231,8 @@
230231
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsNormalizerEnabledResponse;
231232
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneRequest;
232233
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsProcedureDoneResponse;
233-
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
234-
.IsSnapshotCleanupEnabledRequest;
235-
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
236-
.IsSnapshotCleanupEnabledResponse;
234+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotCleanupEnabledRequest;
235+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotCleanupEnabledResponse;
237236
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneRequest;
238237
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSnapshotDoneResponse;
239238
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsSplitOrMergeEnabledRequest;
@@ -287,10 +286,8 @@
287286
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaRequest;
288287
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaResponse;
289288
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetRegionStateInMetaRequest;
290-
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
291-
.SetSnapshotCleanupRequest;
292-
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos
293-
.SetSnapshotCleanupResponse;
289+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSnapshotCleanupRequest;
290+
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSnapshotCleanupResponse;
294291
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledRequest;
295292
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetSplitOrMergeEnabledResponse;
296293
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetTableStateInMetaRequest;
@@ -2379,12 +2376,18 @@ public ClearDeadServersResponse clearDeadServers(RpcController controller,
23792376
LOG.debug("Some dead server is still under processing, won't clear the dead server list");
23802377
response.addAllServerName(request.getServerNameList());
23812378
} else {
2379+
DeadServer deadServer = master.getServerManager().getDeadServers();
2380+
Set<Address> clearedServers = new HashSet<>();
23822381
for (HBaseProtos.ServerName pbServer : request.getServerNameList()) {
2383-
if (!master.getServerManager().getDeadServers()
2384-
.removeDeadServer(ProtobufUtil.toServerName(pbServer))) {
2382+
ServerName server = ProtobufUtil.toServerName(pbServer);
2383+
if (!deadServer.removeDeadServer(server)) {
23852384
response.addServerName(pbServer);
2385+
} else {
2386+
clearedServers.add(server.getAddress());
23862387
}
23872388
}
2389+
master.getRSGroupInfoManager().removeServers(clearedServers);
2390+
LOG.info("Remove decommissioned servers {} from RSGroup done", clearedServers);
23882391
}
23892392

23902393
if (master.cpHost != null) {

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,5 +544,5 @@ default SplitWALManager getSplitWALManager(){
544544
/**
545545
* @return the {@link RSGroupInfoManager}
546546
*/
547-
RSGroupInfoManager getRSRSGroupInfoManager();
547+
RSGroupInfoManager getRSGroupInfoManager();
548548
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.apache.hadoop.hbase.procedure2.ProcedureInMemoryChore;
7373
import org.apache.hadoop.hbase.procedure2.util.StringUtils;
7474
import org.apache.hadoop.hbase.regionserver.SequenceId;
75+
import org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer;
7576
import org.apache.hadoop.hbase.util.Bytes;
7677
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
7778
import org.apache.hadoop.hbase.util.HasThread;
@@ -329,6 +330,11 @@ private LoadBalancer getBalancer() {
329330
return master.getLoadBalancer();
330331
}
331332

333+
private FavoredNodesPromoter getFavoredNodePromoter() {
334+
return (FavoredNodesPromoter) ((RSGroupBasedLoadBalancer) master.getLoadBalancer())
335+
.getInternalBalancer();
336+
}
337+
332338
private MasterProcedureEnv getProcedureEnvironment() {
333339
return master.getMasterProcedureExecutor().getEnvironment();
334340
}
@@ -372,7 +378,7 @@ public RegionStateStore getRegionStateStore() {
372378

373379
public List<ServerName> getFavoredNodes(final RegionInfo regionInfo) {
374380
return this.shouldAssignRegionsWithFavoredNodes
375-
? ((FavoredStochasticBalancer) getBalancer()).getFavoredNodes(regionInfo)
381+
? getFavoredNodePromoter().getFavoredNodes(regionInfo)
376382
: ServerName.EMPTY_SERVER_LIST;
377383
}
378384

@@ -1833,8 +1839,8 @@ public void markRegionAsSplit(final RegionInfo parent, final ServerName serverNa
18331839
regionStateStore.splitRegion(parent, daughterA, daughterB, serverName);
18341840
if (shouldAssignFavoredNodes(parent)) {
18351841
List<ServerName> onlineServers = this.master.getServerManager().getOnlineServersList();
1836-
((FavoredNodesPromoter)getBalancer()).
1837-
generateFavoredNodesForDaughter(onlineServers, parent, daughterA, daughterB);
1842+
getFavoredNodePromoter().generateFavoredNodesForDaughter(onlineServers, parent, daughterA,
1843+
daughterB);
18381844
}
18391845
}
18401846

@@ -1859,8 +1865,7 @@ public void markRegionAsMerged(final RegionInfo child, final ServerName serverNa
18591865
}
18601866
regionStateStore.mergeRegions(child, mergeParents, serverName);
18611867
if (shouldAssignFavoredNodes(child)) {
1862-
((FavoredNodesPromoter)getBalancer()).
1863-
generateFavoredNodesForMergedRegion(child, mergeParents);
1868+
getFavoredNodePromoter().generateFavoredNodesForMergedRegion(child, mergeParents);
18641869
}
18651870
}
18661871

hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ private List<ServerName> getOnlineFavoredNodes(List<ServerName> onlineServers,
473473
}
474474
}
475475

476+
@Override
476477
public synchronized List<ServerName> getFavoredNodes(RegionInfo regionInfo) {
477478
return this.fnm.getFavoredNodes(regionInfo);
478479
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
*/
1818
package org.apache.hadoop.hbase.master.balancer;
1919

20-
import org.apache.yetus.audience.InterfaceAudience;
2120
import org.apache.hadoop.conf.Configuration;
2221
import org.apache.hadoop.hbase.HConstants;
2322
import org.apache.hadoop.hbase.master.LoadBalancer;
24-
import org.apache.hadoop.util.ReflectionUtils;
23+
import org.apache.hadoop.hbase.util.ReflectionUtils;
24+
import org.apache.yetus.audience.InterfaceAudience;
2525

2626
/**
2727
* The class that creates a load balancer from a conf.
@@ -30,8 +30,7 @@
3030
public class LoadBalancerFactory {
3131

3232
/**
33-
* The default {@link LoadBalancer} class.
34-
*
33+
* The default {@link LoadBalancer} class.
3534
* @return The Class for the default {@link LoadBalancer}.
3635
*/
3736
public static Class<? extends LoadBalancer> getDefaultLoadBalancerClass() {
@@ -40,16 +39,15 @@ public static Class<? extends LoadBalancer> getDefaultLoadBalancerClass() {
4039

4140
/**
4241
* Create a loadbalancer from the given conf.
43-
* @param conf
4442
* @return A {@link LoadBalancer}
4543
*/
4644
public static LoadBalancer getLoadBalancer(Configuration conf) {
47-
4845
// Create the balancer
4946
Class<? extends LoadBalancer> balancerKlass =
50-
conf.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, getDefaultLoadBalancerClass(),
51-
LoadBalancer.class);
52-
return ReflectionUtils.newInstance(balancerKlass, conf);
53-
47+
conf.getClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, getDefaultLoadBalancerClass(),
48+
LoadBalancer.class);
49+
LoadBalancer balancer = ReflectionUtils.newInstance(balancerKlass);
50+
balancer.setConf(conf);
51+
return balancer;
5452
}
5553
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.apache.hadoop.hbase.master.procedure;
2020

2121
import java.io.IOException;
22+
import java.util.function.Supplier;
2223
import org.apache.hadoop.hbase.NamespaceDescriptor;
2324
import org.apache.hadoop.hbase.TableName;
2425
import org.apache.hadoop.hbase.master.MasterFileSystem;
@@ -28,6 +29,7 @@
2829
import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;
2930

3031
import org.apache.hadoop.hbase.procedure2.StateMachineProcedure;
32+
import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
3133
import org.apache.hadoop.hbase.util.FSUtils;
3234

3335
/**
@@ -122,4 +124,13 @@ public static void createDirectory(MasterFileSystem mfs, NamespaceDescriptor nsD
122124
protected void releaseSyncLatch() {
123125
ProcedurePrepareLatch.releaseLatch(syncLatch, this);
124126
}
127+
128+
protected final void checkNamespaceRSGroup(MasterProcedureEnv env, NamespaceDescriptor nd)
129+
throws IOException {
130+
Supplier<String> forWhom = () -> "namespace " + nd.getName();
131+
RSGroupInfo rsGroupInfo = MasterProcedureUtil.checkGroupExists(
132+
env.getMasterServices().getRSGroupInfoManager()::getRSGroup,
133+
MasterProcedureUtil.getNamespaceGroup(nd), forWhom);
134+
MasterProcedureUtil.checkGroupNotEmpty(rsGroupInfo, forWhom);
135+
}
125136
}

0 commit comments

Comments
 (0)