HBASE-2977. Refactor master command line to a new class
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@995674 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9453a813d0
commit
94b78b4997
|
@ -901,6 +901,7 @@ Release 0.21.0 - Unreleased
|
||||||
HBaseObjectWritable (Gary Helmling via Andrew Purtell)
|
HBaseObjectWritable (Gary Helmling via Andrew Purtell)
|
||||||
HBASE-2976 Running HFile tool passing fully-qualified filename I get
|
HBASE-2976 Running HFile tool passing fully-qualified filename I get
|
||||||
'IllegalArgumentException: Wrong FS'
|
'IllegalArgumentException: Wrong FS'
|
||||||
|
HBASE-2977 Refactor master command line to a new class
|
||||||
|
|
||||||
NEW FEATURES
|
NEW FEATURES
|
||||||
HBASE-1961 HBase EC2 scripts
|
HBASE-1961 HBase EC2 scripts
|
||||||
|
|
|
@ -21,8 +21,6 @@ package org.apache.hadoop.hbase.master;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.management.ManagementFactory;
|
|
||||||
import java.lang.management.RuntimeMXBean;
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
@ -31,13 +29,10 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import org.apache.commons.cli.CommandLine;
|
|
||||||
import org.apache.commons.cli.GnuParser;
|
|
||||||
import org.apache.commons.cli.Options;
|
|
||||||
import org.apache.commons.cli.ParseException;
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.util.ToolRunner;
|
||||||
import org.apache.hadoop.hbase.Chore;
|
import org.apache.hadoop.hbase.Chore;
|
||||||
import org.apache.hadoop.hbase.ClusterStatus;
|
import org.apache.hadoop.hbase.ClusterStatus;
|
||||||
import org.apache.hadoop.hbase.HBaseConfiguration;
|
import org.apache.hadoop.hbase.HBaseConfiguration;
|
||||||
|
@ -775,15 +770,6 @@ implements HMasterInterface, HMasterRegionInterface, MasterServices, Server {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void printUsageAndExit() {
|
|
||||||
System.err.println("Usage: Master [opts] start|stop");
|
|
||||||
System.err.println(" start Start Master. If local mode, start Master and RegionServer in same JVM");
|
|
||||||
System.err.println(" stop Start cluster shutdown; Master signals RegionServer shutdown");
|
|
||||||
System.err.println(" where [opts] are:");
|
|
||||||
System.err.println(" --minServers=<servers> Minimum RegionServers needed to host user tables.");
|
|
||||||
System.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void abort(final String msg, final Throwable t) {
|
public void abort(final String msg, final Throwable t) {
|
||||||
if (t != null) LOG.fatal(msg, t);
|
if (t != null) LOG.fatal(msg, t);
|
||||||
|
@ -866,143 +852,16 @@ implements HMasterInterface, HMasterRegionInterface, MasterServices, Server {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Version of master that will shutdown the passed zk cluster on its way out.
|
|
||||||
*/
|
|
||||||
static class LocalHMaster extends HMaster {
|
|
||||||
private MiniZooKeeperCluster zkcluster = null;
|
|
||||||
|
|
||||||
public LocalHMaster(Configuration conf)
|
|
||||||
throws IOException, KeeperException, InterruptedException {
|
|
||||||
super(conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
super.run();
|
|
||||||
if (this.zkcluster != null) {
|
|
||||||
try {
|
|
||||||
this.zkcluster.shutdown();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setZKCluster(final MiniZooKeeperCluster zkcluster) {
|
|
||||||
this.zkcluster = zkcluster;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void doMain(String [] args,
|
protected static void doMain(String [] args,
|
||||||
Class<? extends HMaster> masterClass) {
|
Class<? extends HMaster> masterClass) throws Exception {
|
||||||
Configuration conf = HBaseConfiguration.create();
|
int ret = ToolRunner.run(
|
||||||
|
HBaseConfiguration.create(),
|
||||||
Options opt = new Options();
|
new HMasterCommandLine(masterClass),
|
||||||
opt.addOption("minServers", true, "Minimum RegionServers needed to host user tables");
|
args);
|
||||||
opt.addOption("D", true, "Override HBase Configuration Settings");
|
if (ret != 0) {
|
||||||
opt.addOption("backup", false, "Do not try to become HMaster until the primary fails");
|
System.exit(ret);
|
||||||
try {
|
|
||||||
CommandLine cmd = new GnuParser().parse(opt, args);
|
|
||||||
|
|
||||||
if (cmd.hasOption("minServers")) {
|
|
||||||
String val = cmd.getOptionValue("minServers");
|
|
||||||
conf.setInt("hbase.regions.server.count.min",
|
|
||||||
Integer.valueOf(val));
|
|
||||||
LOG.debug("minServers set to " + val);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd.hasOption("D")) {
|
|
||||||
for (String confOpt : cmd.getOptionValues("D")) {
|
|
||||||
String[] kv = confOpt.split("=", 2);
|
|
||||||
if (kv.length == 2) {
|
|
||||||
conf.set(kv[0], kv[1]);
|
|
||||||
LOG.debug("-D configuration override: " + kv[0] + "=" + kv[1]);
|
|
||||||
} else {
|
|
||||||
throw new ParseException("-D option format invalid: " + confOpt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we are the backup master - override the conf if so
|
|
||||||
if (cmd.hasOption("backup")) {
|
|
||||||
conf.setBoolean(HConstants.MASTER_TYPE_BACKUP, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd.getArgList().contains("start")) {
|
|
||||||
try {
|
|
||||||
// Print out vm stats before starting up.
|
|
||||||
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
|
|
||||||
if (runtime != null) {
|
|
||||||
LOG.info("vmName=" + runtime.getVmName() + ", vmVendor=" +
|
|
||||||
runtime.getVmVendor() + ", vmVersion=" + runtime.getVmVersion());
|
|
||||||
LOG.info("vmInputArguments=" + runtime.getInputArguments());
|
|
||||||
}
|
|
||||||
// If 'local', defer to LocalHBaseCluster instance. Starts master
|
|
||||||
// and regionserver both in the one JVM.
|
|
||||||
if (LocalHBaseCluster.isLocal(conf)) {
|
|
||||||
final MiniZooKeeperCluster zooKeeperCluster =
|
|
||||||
new MiniZooKeeperCluster();
|
|
||||||
File zkDataPath = new File(conf.get("hbase.zookeeper.property.dataDir"));
|
|
||||||
int zkClientPort = conf.getInt("hbase.zookeeper.property.clientPort", 0);
|
|
||||||
if (zkClientPort == 0) {
|
|
||||||
throw new IOException("No config value for hbase.zookeeper.property.clientPort");
|
|
||||||
}
|
|
||||||
zooKeeperCluster.setTickTime(conf.getInt("hbase.zookeeper.property.tickTime", 3000));
|
|
||||||
zooKeeperCluster.setClientPort(zkClientPort);
|
|
||||||
int clientPort = zooKeeperCluster.startup(zkDataPath);
|
|
||||||
if (clientPort != zkClientPort) {
|
|
||||||
String errorMsg = "Couldnt start ZK at requested address of " +
|
|
||||||
zkClientPort + ", instead got: " + clientPort + ". Aborting. Why? " +
|
|
||||||
"Because clients (eg shell) wont be able to find this ZK quorum";
|
|
||||||
System.err.println(errorMsg);
|
|
||||||
throw new IOException(errorMsg);
|
|
||||||
}
|
|
||||||
conf.set("hbase.zookeeper.property.clientPort",
|
|
||||||
Integer.toString(clientPort));
|
|
||||||
// Need to have the zk cluster shutdown when master is shutdown.
|
|
||||||
// Run a subclass that does the zk cluster shutdown on its way out.
|
|
||||||
LocalHBaseCluster cluster = new LocalHBaseCluster(conf, 1,
|
|
||||||
LocalHMaster.class, HRegionServer.class);
|
|
||||||
((LocalHMaster)cluster.getMaster()).setZKCluster(zooKeeperCluster);
|
|
||||||
cluster.startup();
|
|
||||||
} else {
|
|
||||||
HMaster master = constructMaster(masterClass, conf);
|
|
||||||
if (master.isStopped()) {
|
|
||||||
LOG.info("Won't bring the Master up as a shutdown is requested");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
master.start();
|
|
||||||
}
|
|
||||||
} catch (Throwable t) {
|
|
||||||
LOG.error("Failed to start master", t);
|
|
||||||
System.exit(-1);
|
|
||||||
}
|
|
||||||
} else if (cmd.getArgList().contains("stop")) {
|
|
||||||
HBaseAdmin adm = null;
|
|
||||||
try {
|
|
||||||
adm = new HBaseAdmin(conf);
|
|
||||||
} catch (MasterNotRunningException e) {
|
|
||||||
LOG.error("Master not running");
|
|
||||||
System.exit(0);
|
|
||||||
} catch (ZooKeeperConnectionException e) {
|
|
||||||
LOG.error("ZooKeeper not available");
|
|
||||||
System.exit(0);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
adm.shutdown();
|
|
||||||
} catch (Throwable t) {
|
|
||||||
LOG.error("Failed to stop master", t);
|
|
||||||
System.exit(-1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new ParseException("Unknown argument(s): " +
|
|
||||||
org.apache.commons.lang.StringUtils.join(cmd.getArgs(), " "));
|
|
||||||
}
|
|
||||||
} catch (ParseException e) {
|
|
||||||
LOG.error("Could not parse: ", e);
|
|
||||||
printUsageAndExit();
|
|
||||||
}
|
}
|
||||||
|
// Otherwise exit gracefully so other threads clean up
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1010,7 +869,7 @@ implements HMasterInterface, HMasterRegionInterface, MasterServices, Server {
|
||||||
* @param args
|
* @param args
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static void main(String [] args) throws IOException {
|
public static void main(String [] args) throws Exception {
|
||||||
doMain(args, HMaster.class);
|
doMain(args, HMaster.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,224 @@
|
||||||
|
/**
|
||||||
|
* Copyright 2010 The Apache Software Foundation
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.hadoop.hbase.master;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.management.RuntimeMXBean;
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.cli.CommandLine;
|
||||||
|
import org.apache.commons.cli.GnuParser;
|
||||||
|
import org.apache.commons.cli.Options;
|
||||||
|
import org.apache.commons.cli.ParseException;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.conf.Configured;
|
||||||
|
import org.apache.hadoop.util.Tool;
|
||||||
|
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
|
||||||
|
import org.apache.hadoop.hbase.HBaseConfiguration;
|
||||||
|
import org.apache.hadoop.hbase.HConstants;
|
||||||
|
import org.apache.hadoop.hbase.LocalHBaseCluster;
|
||||||
|
import org.apache.hadoop.hbase.MasterNotRunningException;
|
||||||
|
import org.apache.hadoop.hbase.client.HBaseAdmin;
|
||||||
|
import org.apache.hadoop.hbase.regionserver.HRegionServer;
|
||||||
|
import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster;
|
||||||
|
import org.apache.zookeeper.KeeperException;
|
||||||
|
|
||||||
|
public class HMasterCommandLine extends Configured implements Tool {
|
||||||
|
private static final Log LOG = LogFactory.getLog(HMasterCommandLine.class);
|
||||||
|
|
||||||
|
private static final String USAGE =
|
||||||
|
"Usage: Master [opts] start|stop\n" +
|
||||||
|
" start Start Master. If local mode, start Master and RegionServer in same JVM\n" +
|
||||||
|
" stop Start cluster shutdown; Master signals RegionServer shutdown\n" +
|
||||||
|
" where [opts] are:\n" +
|
||||||
|
" --minServers=<servers> Minimum RegionServers needed to host user tables.\n" +
|
||||||
|
" --backup Master should start in backup mode";
|
||||||
|
|
||||||
|
private final Class<? extends HMaster> masterClass;
|
||||||
|
|
||||||
|
|
||||||
|
public HMasterCommandLine(Class<? extends HMaster> masterClass) {
|
||||||
|
this.masterClass = masterClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void usage(String message) {
|
||||||
|
if (message != null) {
|
||||||
|
System.err.println(message);
|
||||||
|
System.err.println("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println(USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void logJVMInfo() {
|
||||||
|
// Print out vm stats before starting up.
|
||||||
|
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
|
||||||
|
if (runtime != null) {
|
||||||
|
LOG.info("vmName=" + runtime.getVmName() + ", vmVendor=" +
|
||||||
|
runtime.getVmVendor() + ", vmVersion=" + runtime.getVmVersion());
|
||||||
|
LOG.info("vmInputArguments=" + runtime.getInputArguments());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int run(String args[]) throws Exception {
|
||||||
|
Options opt = new Options();
|
||||||
|
opt.addOption("minServers", true, "Minimum RegionServers needed to host user tables");
|
||||||
|
opt.addOption("backup", false, "Do not try to become HMaster until the primary fails");
|
||||||
|
|
||||||
|
|
||||||
|
CommandLine cmd;
|
||||||
|
try {
|
||||||
|
cmd = new GnuParser().parse(opt, args);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
LOG.error("Could not parse: ", e);
|
||||||
|
usage(null);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (cmd.hasOption("minServers")) {
|
||||||
|
String val = cmd.getOptionValue("minServers");
|
||||||
|
getConf().setInt("hbase.regions.server.count.min",
|
||||||
|
Integer.valueOf(val));
|
||||||
|
LOG.debug("minServers set to " + val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if we are the backup master - override the conf if so
|
||||||
|
if (cmd.hasOption("backup")) {
|
||||||
|
getConf().setBoolean(HConstants.MASTER_TYPE_BACKUP, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> remainingArgs = cmd.getArgList();
|
||||||
|
if (remainingArgs.size() != 1) {
|
||||||
|
usage(null);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String command = remainingArgs.get(0);
|
||||||
|
|
||||||
|
if ("start".equals(command)) {
|
||||||
|
return startMaster();
|
||||||
|
} else if ("stop".equals(command)) {
|
||||||
|
return stopMaster();
|
||||||
|
} else {
|
||||||
|
usage("Invalid command: " + command);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int startMaster() {
|
||||||
|
Configuration conf = getConf();
|
||||||
|
try {
|
||||||
|
// If 'local', defer to LocalHBaseCluster instance. Starts master
|
||||||
|
// and regionserver both in the one JVM.
|
||||||
|
if (LocalHBaseCluster.isLocal(conf)) {
|
||||||
|
final MiniZooKeeperCluster zooKeeperCluster =
|
||||||
|
new MiniZooKeeperCluster();
|
||||||
|
File zkDataPath = new File(conf.get("hbase.zookeeper.property.dataDir"));
|
||||||
|
int zkClientPort = conf.getInt("hbase.zookeeper.property.clientPort", 0);
|
||||||
|
if (zkClientPort == 0) {
|
||||||
|
throw new IOException("No config value for hbase.zookeeper.property.clientPort");
|
||||||
|
}
|
||||||
|
zooKeeperCluster.setTickTime(conf.getInt("hbase.zookeeper.property.tickTime", 3000));
|
||||||
|
zooKeeperCluster.setClientPort(zkClientPort);
|
||||||
|
int clientPort = zooKeeperCluster.startup(zkDataPath);
|
||||||
|
if (clientPort != zkClientPort) {
|
||||||
|
String errorMsg = "Couldnt start ZK at requested address of " +
|
||||||
|
zkClientPort + ", instead got: " + clientPort + ". Aborting. Why? " +
|
||||||
|
"Because clients (eg shell) wont be able to find this ZK quorum";
|
||||||
|
System.err.println(errorMsg);
|
||||||
|
throw new IOException(errorMsg);
|
||||||
|
}
|
||||||
|
conf.set("hbase.zookeeper.property.clientPort",
|
||||||
|
Integer.toString(clientPort));
|
||||||
|
// Need to have the zk cluster shutdown when master is shutdown.
|
||||||
|
// Run a subclass that does the zk cluster shutdown on its way out.
|
||||||
|
LocalHBaseCluster cluster = new LocalHBaseCluster(conf, 1,
|
||||||
|
LocalHMaster.class, HRegionServer.class);
|
||||||
|
((LocalHMaster)cluster.getMaster()).setZKCluster(zooKeeperCluster);
|
||||||
|
cluster.startup();
|
||||||
|
} else {
|
||||||
|
HMaster master = HMaster.constructMaster(masterClass, conf);
|
||||||
|
if (master.isStopped()) {
|
||||||
|
LOG.info("Won't bring the Master up as a shutdown is requested");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
master.start();
|
||||||
|
master.join();
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
LOG.error("Failed to start master", t);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int stopMaster() {
|
||||||
|
HBaseAdmin adm = null;
|
||||||
|
try {
|
||||||
|
adm = new HBaseAdmin(getConf());
|
||||||
|
} catch (MasterNotRunningException e) {
|
||||||
|
LOG.error("Master not running");
|
||||||
|
return -1;
|
||||||
|
} catch (ZooKeeperConnectionException e) {
|
||||||
|
LOG.error("ZooKeeper not available");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
adm.shutdown();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
LOG.error("Failed to stop master", t);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Version of master that will shutdown the passed zk cluster on its way out.
|
||||||
|
*/
|
||||||
|
static class LocalHMaster extends HMaster {
|
||||||
|
private MiniZooKeeperCluster zkcluster = null;
|
||||||
|
|
||||||
|
public LocalHMaster(Configuration conf)
|
||||||
|
throws IOException, KeeperException, InterruptedException {
|
||||||
|
super(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
super.run();
|
||||||
|
if (this.zkcluster != null) {
|
||||||
|
try {
|
||||||
|
this.zkcluster.shutdown();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setZKCluster(final MiniZooKeeperCluster zkcluster) {
|
||||||
|
this.zkcluster = zkcluster;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -56,7 +56,7 @@ public class OOMEHMaster extends HMaster {
|
||||||
* @param args
|
* @param args
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws Exception {
|
||||||
doMain(args, OOMEHMaster.class);
|
doMain(args, OOMEHMaster.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue