|
@@ -19,6 +19,8 @@
|
|
|
|
|
|
package org.apache.hadoop.hdfs.server.diskbalancer.command;
|
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.commons.text.TextStringBuilder;
|
|
|
import org.apache.hadoop.util.Preconditions;
|
|
|
import org.apache.commons.cli.CommandLine;
|
|
|
import org.apache.commons.cli.HelpFormatter;
|
|
@@ -30,6 +32,11 @@ import org.apache.hadoop.hdfs.server.diskbalancer.DiskBalancerException;
|
|
|
import org.apache.hadoop.hdfs.tools.DiskBalancerCLI;
|
|
|
import org.apache.hadoop.net.NetUtils;
|
|
|
|
|
|
+import java.io.PrintStream;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.TreeSet;
|
|
|
+
|
|
|
/**
|
|
|
* Gets the current status of disk balancer command.
|
|
|
*/
|
|
@@ -41,9 +48,13 @@ public class QueryCommand extends Command {
|
|
|
* @param conf - Configuration.
|
|
|
*/
|
|
|
public QueryCommand(Configuration conf) {
|
|
|
- super(conf);
|
|
|
+ this(conf, System.out);
|
|
|
+ }
|
|
|
+
|
|
|
+ public QueryCommand(Configuration conf, final PrintStream ps) {
|
|
|
+ super(conf, ps);
|
|
|
addValidCommandParameters(DiskBalancerCLI.QUERY,
|
|
|
- "Queries the status of disk plan running on a given datanode.");
|
|
|
+ "Queries the status of disk plan running on given datanode(s).");
|
|
|
addValidCommandParameters(DiskBalancerCLI.VERBOSE,
|
|
|
"Prints verbose results.");
|
|
|
}
|
|
@@ -56,37 +67,55 @@ public class QueryCommand extends Command {
|
|
|
@Override
|
|
|
public void execute(CommandLine cmd) throws Exception {
|
|
|
LOG.info("Executing \"query plan\" command.");
|
|
|
+ TextStringBuilder result = new TextStringBuilder();
|
|
|
Preconditions.checkState(cmd.hasOption(DiskBalancerCLI.QUERY));
|
|
|
verifyCommandOptions(DiskBalancerCLI.QUERY, cmd);
|
|
|
- String nodeName = cmd.getOptionValue(DiskBalancerCLI.QUERY);
|
|
|
- Preconditions.checkNotNull(nodeName);
|
|
|
- nodeName = nodeName.trim();
|
|
|
- String nodeAddress = nodeName;
|
|
|
-
|
|
|
- // if the string is not name:port format use the default port.
|
|
|
- if (!nodeName.matches("[^\\:]+:[0-9]{2,5}")) {
|
|
|
- int defaultIPC = NetUtils.createSocketAddr(
|
|
|
- getConf().getTrimmed(DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_KEY,
|
|
|
- DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_DEFAULT)).getPort();
|
|
|
- nodeAddress = nodeName + ":" + defaultIPC;
|
|
|
- LOG.debug("Using default data node port : {}", nodeAddress);
|
|
|
+ String nodeVal = cmd.getOptionValue(DiskBalancerCLI.QUERY);
|
|
|
+ if (StringUtils.isBlank(nodeVal)) {
|
|
|
+ String warnMsg = "The number of input nodes is 0. "
|
|
|
+ + "Please input the valid nodes.";
|
|
|
+ throw new DiskBalancerException(warnMsg,
|
|
|
+ DiskBalancerException.Result.INVALID_NODE);
|
|
|
}
|
|
|
+ nodeVal = nodeVal.trim();
|
|
|
+ Set<String> resultSet = new TreeSet<>();
|
|
|
+ String[] nodes = nodeVal.split(",");
|
|
|
+ Collections.addAll(resultSet, nodes);
|
|
|
+ String outputLine = String.format(
|
|
|
+ "Get current status of the diskbalancer for DataNode(s). "
|
|
|
+ + "These DataNode(s) are parsed from '%s'.", nodeVal);
|
|
|
+ recordOutput(result, outputLine);
|
|
|
+ for (String nodeName : resultSet) {
|
|
|
+ // if the string is not name:port format use the default port.
|
|
|
+ String nodeAddress = nodeName;
|
|
|
+ if (!nodeName.matches("[^\\:]+:[0-9]{2,5}")) {
|
|
|
+ int defaultIPC = NetUtils.createSocketAddr(
|
|
|
+ getConf().getTrimmed(DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_KEY,
|
|
|
+ DFSConfigKeys.DFS_DATANODE_IPC_ADDRESS_DEFAULT)).getPort();
|
|
|
+ nodeAddress = nodeName + ":" + defaultIPC;
|
|
|
+ LOG.debug("Using default data node port : {}", nodeAddress);
|
|
|
+ }
|
|
|
|
|
|
- ClientDatanodeProtocol dataNode = getDataNodeProxy(nodeAddress);
|
|
|
- try {
|
|
|
- DiskBalancerWorkStatus workStatus = dataNode.queryDiskBalancerPlan();
|
|
|
- System.out.printf("Plan File: %s%nPlan ID: %s%nResult: %s%n",
|
|
|
- workStatus.getPlanFile(),
|
|
|
- workStatus.getPlanID(),
|
|
|
- workStatus.getResult().toString());
|
|
|
-
|
|
|
- if (cmd.hasOption(DiskBalancerCLI.VERBOSE)) {
|
|
|
- System.out.printf("%s", workStatus.currentStateString());
|
|
|
+ ClientDatanodeProtocol dataNode = getDataNodeProxy(nodeAddress);
|
|
|
+ try {
|
|
|
+ DiskBalancerWorkStatus workStatus = dataNode.queryDiskBalancerPlan();
|
|
|
+ outputLine = String.format("DataNode: %s%nPlan File: %s%nPlan ID: %s%nResult: %s%n",
|
|
|
+ nodeAddress,
|
|
|
+ workStatus.getPlanFile(),
|
|
|
+ workStatus.getPlanID(),
|
|
|
+ workStatus.getResult().toString());
|
|
|
+ result.append(outputLine);
|
|
|
+ if (cmd.hasOption(DiskBalancerCLI.VERBOSE)) {
|
|
|
+ outputLine = String.format("%s", workStatus.currentStateString());
|
|
|
+ result.append(outputLine);
|
|
|
+ }
|
|
|
+ result.append(System.lineSeparator());
|
|
|
+ } catch (DiskBalancerException ex) {
|
|
|
+ LOG.error("Query plan failed by {}", nodeAddress, ex);
|
|
|
+ throw ex;
|
|
|
}
|
|
|
- } catch (DiskBalancerException ex) {
|
|
|
- LOG.error("Query plan failed.", ex);
|
|
|
- throw ex;
|
|
|
}
|
|
|
+ getPrintStream().println(result);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -94,14 +123,14 @@ public class QueryCommand extends Command {
|
|
|
*/
|
|
|
@Override
|
|
|
public void printHelp() {
|
|
|
- String header = "Query Plan queries a given data node about the " +
|
|
|
+ String header = "Query Plan queries given datanode(s) about the " +
|
|
|
"current state of disk balancer execution.\n\n";
|
|
|
|
|
|
String footer = "\nQuery command retrievs the plan ID and the current " +
|
|
|
"running state. ";
|
|
|
-
|
|
|
HelpFormatter helpFormatter = new HelpFormatter();
|
|
|
- helpFormatter.printHelp("hdfs diskbalancer -query <hostname> [options]",
|
|
|
+ helpFormatter.printHelp("hdfs diskbalancer -query <hostname,hostname,...> " +
|
|
|
+ " [options]",
|
|
|
header, DiskBalancerCLI.getQueryOptions(), footer);
|
|
|
}
|
|
|
}
|