package org.apache.hadoop.mapred;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ClusterBalancerTool extends Configured implements Tool {
private boolean rebalanceClusters = false;
private boolean moveMachines = false;
private boolean getStatus = false;
public void displayUsage(String cmd) {
String prefix = "Usage: ClusterBalancerTool ";
if (cmd.equals("-rebalance")) {
System.err.println(prefix + "[" + cmd + "]");
} else if (cmd.equals("-move")) {
System.err.println(prefix + "[" + cmd + " <from-cluster-name> " +
"<to-cluster-name> <num-machines>]");
} else if (cmd.endsWith("status")) {
System.err.println(prefix + "[ " + cmd + " <cluster-name>]");
} else {
System.err.println(prefix + " <command> <args>");
System.err.println("\t[-move <from-cluster-name> <to-cluster-name> " +
"<num-machines>]");
System.err.println("\t[-rebalance]");
System.err.println("\t[-status <cluster-name>]");
}
}
public int run(String[] args) throws Exception {
int exitCode = -1;
if (args.length < 1) {
displayUsage("");
return exitCode;
}
String cmd = args[0];
if (cmd.equals("-move")) {
if (args.length != 4) {
displayUsage(cmd);
return exitCode;
}
moveMachines = true;
} else if (cmd.equals("-rebalance")) {
if (args.length != 1) {
displayUsage(cmd);
return exitCode;
}
rebalanceClusters = true;
} else if (cmd.equals("-status")) {
if (args.length != 2) {
displayUsage(cmd);
return exitCode;
}
getStatus = true;
} else {
displayUsage(cmd);
return exitCode;
}
if (rebalanceClusters) {
exitCode = getClusterBalancerAdmin().rebalance();
} else if (moveMachines) {
exitCode = getClusterBalancerAdmin().moveMachines(args[1], args[2],
Integer.valueOf(args[3]));
} else if (getStatus) {
String status = getClusterBalancerAdmin().getCurrentStatus(args[1]);
System.out.println(status);
exitCode = 0;
}
return exitCode;
}
@Override
public void setConf(Configuration conf) {
super.setConf(conf);
Configuration.addDefaultResource(
DynamicCloudsDaemon.CLUSTER_BALANCER_CONF_FILE);
}
private ClusterBalancerAdminProtocol getClusterBalancerAdmin()
throws IOException {
Configuration.addDefaultResource(
DynamicCloudsDaemon.CLUSTER_BALANCER_CONF_FILE);
Configuration conf = this.getConf();
String addr = conf.get(DynamicCloudsDaemon.CLUSTER_BALANCER_ADDR);
InetSocketAddress isAddr = NetUtils.createSocketAddr(addr);
return (ClusterBalancerAdminProtocol) RPC.getProxy(
ClusterBalancerAdminProtocol.class,
ClusterBalancerAdminProtocol.versionID, isAddr, conf);
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new ClusterBalancerTool(), args);
System.exit(res);
}
}