HDFS-13183. Addendum: Standby NameNode process getBlocks request to reduce Active load. Contributed by Xiaoqiao He.
This commit is contained in:
parent
10db97df1c
commit
9b38be43c6
@ -708,12 +708,12 @@ static private int doBalance(Collection<URI> namenodes,
|
||||
System.out.println("Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved");
|
||||
|
||||
List<NameNodeConnector> connectors = Collections.emptyList();
|
||||
boolean done = false;
|
||||
for(int iteration = 0; !done; iteration++) {
|
||||
try {
|
||||
connectors = NameNodeConnector.newNameNodeConnectors(namenodes, nsIds,
|
||||
Balancer.class.getSimpleName(), BALANCER_ID_PATH, conf,
|
||||
p.getMaxIdleIteration());
|
||||
try {
|
||||
connectors = NameNodeConnector.newNameNodeConnectors(namenodes, nsIds,
|
||||
Balancer.class.getSimpleName(), BALANCER_ID_PATH, conf,
|
||||
p.getMaxIdleIteration());
|
||||
boolean done = false;
|
||||
for(int iteration = 0; !done; iteration++) {
|
||||
done = true;
|
||||
Collections.shuffle(connectors);
|
||||
for(NameNodeConnector nnc : connectors) {
|
||||
@ -741,10 +741,10 @@ static private int doBalance(Collection<URI> namenodes,
|
||||
if (!done) {
|
||||
Thread.sleep(sleeptime);
|
||||
}
|
||||
} finally {
|
||||
for(NameNodeConnector nnc : connectors) {
|
||||
IOUtils.cleanupWithLogger(LOG, nnc);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
for(NameNodeConnector nnc : connectors) {
|
||||
IOUtils.cleanupWithLogger(LOG, nnc);
|
||||
}
|
||||
}
|
||||
return ExitStatus.SUCCESS.getExitCode();
|
||||
|
@ -147,12 +147,13 @@ public static void checkOtherInstanceRunning(boolean toCheck) {
|
||||
|
||||
private final BalancerProtocols namenode;
|
||||
/**
|
||||
* If set balancerShouldRequestStandby true, Balancer will getBlocks from
|
||||
* If set requestToStandby true, Balancer will getBlocks from
|
||||
* Standby NameNode only and it can reduce the performance impact of Active
|
||||
* NameNode, especially in a busy HA mode cluster.
|
||||
*/
|
||||
private boolean balancerShouldRequestStandby;
|
||||
private NamenodeProtocol standbyNameNode;
|
||||
private boolean requestToStandby;
|
||||
private String nsId;
|
||||
private Configuration config;
|
||||
private final KeyManager keyManager;
|
||||
final AtomicBoolean fallbackToSimpleAuth = new AtomicBoolean(false);
|
||||
|
||||
@ -188,10 +189,10 @@ public NameNodeConnector(String name, URI nameNodeUri, Path idPath,
|
||||
|
||||
this.namenode = NameNodeProxies.createProxy(conf, nameNodeUri,
|
||||
BalancerProtocols.class, fallbackToSimpleAuth).getProxy();
|
||||
this.balancerShouldRequestStandby = conf.getBoolean(
|
||||
this.requestToStandby = conf.getBoolean(
|
||||
DFSConfigKeys.DFS_HA_ALLOW_STALE_READ_KEY,
|
||||
DFSConfigKeys.DFS_HA_ALLOW_STALE_READ_DEFAULT);
|
||||
this.standbyNameNode = null;
|
||||
this.config = conf;
|
||||
|
||||
this.fs = (DistributedFileSystem)FileSystem.get(nameNodeUri, conf);
|
||||
|
||||
@ -216,24 +217,7 @@ public NameNodeConnector(String name, URI nameNodeUri, String nsId,
|
||||
Configuration conf, int maxNotChangedIterations)
|
||||
throws IOException {
|
||||
this(name, nameNodeUri, idPath, targetPaths, conf, maxNotChangedIterations);
|
||||
if (nsId != null && HAUtil.isHAEnabled(conf, nsId)) {
|
||||
List<ClientProtocol> namenodes =
|
||||
HAUtil.getProxiesForAllNameNodesInNameservice(conf, nsId);
|
||||
for (ClientProtocol proxy : namenodes) {
|
||||
try {
|
||||
if (proxy.getHAServiceState().equals(
|
||||
HAServiceProtocol.HAServiceState.STANDBY)) {
|
||||
this.standbyNameNode = NameNodeProxies.createNonHAProxy(
|
||||
conf, RPC.getServerAddress(proxy), NamenodeProtocol.class,
|
||||
UserGroupInformation.getCurrentUser(), false).getProxy();
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//Ignore the exception while connecting to a namenode.
|
||||
LOG.debug("Error while connecting to namenode", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.nsId = nsId;
|
||||
}
|
||||
|
||||
public DistributedFileSystem getDistributedFileSystem() {
|
||||
@ -255,23 +239,43 @@ public BlocksWithLocations getBlocks(DatanodeInfo datanode, long size, long
|
||||
if (getBlocksRateLimiter != null) {
|
||||
getBlocksRateLimiter.acquire();
|
||||
}
|
||||
boolean isRequestStandby = true;
|
||||
boolean isRequestStandby = false;
|
||||
NamenodeProtocol nnproxy = null;
|
||||
try {
|
||||
if (balancerShouldRequestStandby && standbyNameNode != null) {
|
||||
return standbyNameNode.getBlocks(datanode, size, minBlockSize);
|
||||
if (requestToStandby && nsId != null
|
||||
&& HAUtil.isHAEnabled(config, nsId)) {
|
||||
List<ClientProtocol> namenodes =
|
||||
HAUtil.getProxiesForAllNameNodesInNameservice(config, nsId);
|
||||
for (ClientProtocol proxy : namenodes) {
|
||||
try {
|
||||
if (proxy.getHAServiceState().equals(
|
||||
HAServiceProtocol.HAServiceState.STANDBY)) {
|
||||
NamenodeProtocol sbn = NameNodeProxies.createNonHAProxy(
|
||||
config, RPC.getServerAddress(proxy), NamenodeProtocol.class,
|
||||
UserGroupInformation.getCurrentUser(), false).getProxy();
|
||||
nnproxy = sbn;
|
||||
isRequestStandby = true;
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignore the exception while connecting to a namenode.
|
||||
LOG.debug("Error while connecting to namenode", e);
|
||||
}
|
||||
}
|
||||
if (nnproxy == null) {
|
||||
LOG.warn("Request #getBlocks to Standby NameNode but meet exception,"
|
||||
+ " will fallback to normal way.");
|
||||
nnproxy = namenode;
|
||||
}
|
||||
} else {
|
||||
isRequestStandby = false;
|
||||
nnproxy = namenode;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Request #getBlocks to Standby NameNode but meet exception, " +
|
||||
"will fallback to normal way", e);
|
||||
isRequestStandby = false;
|
||||
return nnproxy.getBlocks(datanode, size, minBlockSize);
|
||||
} finally {
|
||||
if (isRequestStandby) {
|
||||
LOG.info("Request #getBlocks to Standby NameNode success.");
|
||||
}
|
||||
}
|
||||
return namenode.getBlocks(datanode, size, minBlockSize);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user