Author: todd
Date: Fri Sep 10 05:48:39 2010
New Revision: 995674
URL: http://svn.apache.org/viewvc?rev=995674&view=rev
Log:
HBASE-2977. Refactor master command line to a new class
Added:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMasterCommandLine.java
Modified:
hbase/trunk/CHANGES.txt
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/OOMEHMaster.java
Modified: hbase/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=995674&r1=995673&r2=995674&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Sep 10 05:48:39 2010
@@ -901,6 +901,7 @@ Release 0.21.0 - Unreleased
HBaseObjectWritable (Gary Helmling via Andrew Purtell)
HBASE-2976 Running HFile tool passing fully-qualified filename I get
'IllegalArgumentException: Wrong FS'
+ HBASE-2977 Refactor master command line to a new class
NEW FEATURES
HBASE-1961 HBase EC2 scripts
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=995674&r1=995673&r2=995674&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Fri
Sep 10 05:48:39 2010
@@ -21,8 +21,6 @@ package org.apache.hadoop.hbase.master;
import java.io.File;
import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.UnknownHostException;
@@ -31,13 +29,10 @@ import java.util.List;
import java.util.Map;
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.LogFactory;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.hbase.Chore;
import org.apache.hadoop.hbase.ClusterStatus;
import org.apache.hadoop.hbase.HBaseConfiguration;
@@ -775,15 +770,6 @@ implements HMasterInterface, HMasterRegi
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
public void abort(final String msg, final Throwable t) {
if (t != null) LOG.fatal(msg, t);
@@ -866,143 +852,16 @@ implements HMasterInterface, HMasterRegi
}
}
- /*
- * 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,
- Class<? extends HMaster> masterClass) {
- Configuration conf = HBaseConfiguration.create();
-
- Options opt = new Options();
- opt.addOption("minServers", true, "Minimum RegionServers needed to host
user tables");
- opt.addOption("D", true, "Override HBase Configuration Settings");
- opt.addOption("backup", false, "Do not try to become HMaster until the
primary fails");
- 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();
+ Class<? extends HMaster> masterClass) throws Exception {
+ int ret = ToolRunner.run(
+ HBaseConfiguration.create(),
+ new HMasterCommandLine(masterClass),
+ args);
+ if (ret != 0) {
+ System.exit(ret);
}
+ // Otherwise exit gracefully so other threads clean up
}
/**
@@ -1010,7 +869,7 @@ implements HMasterInterface, HMasterRegi
* @param args
* @throws IOException
*/
- public static void main(String [] args) throws IOException {
+ public static void main(String [] args) throws Exception {
doMain(args, HMaster.class);
}
}
Added:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMasterCommandLine.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMasterCommandLine.java?rev=995674&view=auto
==============================================================================
---
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMasterCommandLine.java
(added)
+++
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMasterCommandLine.java
Fri Sep 10 05:48:39 2010
@@ -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;
+ }
+ }
+}
\ No newline at end of file
Modified:
hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/OOMEHMaster.java
URL:
http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/OOMEHMaster.java?rev=995674&r1=995673&r2=995674&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/OOMEHMaster.java
(original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/OOMEHMaster.java
Fri Sep 10 05:48:39 2010
@@ -56,7 +56,7 @@ public class OOMEHMaster extends HMaster
* @param args
* @throws IOException
*/
- public static void main(String[] args) throws IOException {
+ public static void main(String[] args) throws Exception {
doMain(args, OOMEHMaster.class);
}
}