HADOOP-1957 Web UI with report on cluster state and basic browsing of tables
git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk/src/contrib/hbase@582442 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6e4efdf697
commit
6c9ddf9f37
|
@ -22,6 +22,7 @@ Trunk (unreleased changes)
|
|||
(Inchul Song and Edward Yoon via Stack)
|
||||
HADOOP-1913 Build a Lucene index on an HBase table
|
||||
(Ning Li via Stack)
|
||||
HADOOP-1957 Web UI with report on cluster state and basic browsing of tables
|
||||
|
||||
OPTIMIZATIONS
|
||||
|
||||
|
|
|
@ -116,6 +116,9 @@ fi
|
|||
if [ -d "$HADOOP_HOME/build/classes" ]; then
|
||||
CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/classes
|
||||
fi
|
||||
if [ -d "$HADOOP_HOME/build/contrib/hbase/webapps" ]; then
|
||||
CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/contrib/hbase/
|
||||
fi
|
||||
if [ -d "$HADOOP_HOME/build/webapps" ]; then
|
||||
CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build
|
||||
fi
|
||||
|
|
35
build.xml
35
build.xml
|
@ -26,6 +26,29 @@ to call at top-level: ant deploy-contrib compile-core-test
|
|||
<project name="hbase" default="jar">
|
||||
<import file="../build-contrib.xml"/>
|
||||
|
||||
<property name="build.webapps" value="${build.dir}/webapps"/>
|
||||
<property name="src.webapps" value="${basedir}/src/webapps" />
|
||||
|
||||
<target name="init">
|
||||
<antcall target="hadoopbuildcontrib.init"/>
|
||||
<!--Version is set only if called from hadoop build.xml. Set a default-->
|
||||
<condition property="version" value="0.15.0-dev">
|
||||
<not>
|
||||
<isset property="version" />
|
||||
</not>
|
||||
</condition>
|
||||
<!--Copy webapps over to build dir. Exclude jsp and generated-src java
|
||||
classes -->
|
||||
<mkdir dir="${build.webapps}"/>
|
||||
<copy todir="${build.webapps}">
|
||||
<fileset dir="${src.webapps}">
|
||||
<exclude name="**/*.jsp" />
|
||||
<exclude name="**/.*" />
|
||||
<exclude name="**/*~" />
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="javacc" if="javacc.home">
|
||||
<echo message="javacc.home: ${javacc.home}"/>
|
||||
<property name="hbaseshell.src.dir"
|
||||
|
@ -40,6 +63,7 @@ to call at top-level: ant deploy-contrib compile-core-test
|
|||
|
||||
<target name="compile" depends="init,javacc">
|
||||
<echo message="contrib: ${name}"/>
|
||||
<!--Compile whats under src and generated java classes made from jsp-->
|
||||
<javac
|
||||
encoding="${build.encoding}"
|
||||
srcdir="${src.dir}"
|
||||
|
@ -57,6 +81,7 @@ to call at top-level: ant deploy-contrib compile-core-test
|
|||
<jar jarfile="${build.dir}/hadoop-${version}-${name}.jar"
|
||||
basedir="${build.classes}" >
|
||||
<fileset file="${root}/conf/hbase-default.xml"/>
|
||||
<zipfileset dir="${build.webapps}" prefix="webapps"/>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
|
@ -85,21 +110,17 @@ to call at top-level: ant deploy-contrib compile-core-test
|
|||
</target>
|
||||
|
||||
<!-- the unit test classpath
|
||||
Copied from ../build-contrib.xml so can add
|
||||
Copied from ../build-contrib.xml so can add to it.
|
||||
-->
|
||||
<path id="test.classpath">
|
||||
<pathelement location="${build.test}" />
|
||||
<pathelement location="${src.test}"/>
|
||||
<pathelement location="${hadoop.root}/build/test/classes"/>
|
||||
<pathelement location="${hadoop.root}/src/contrib/test"/>
|
||||
<pathelement location="${conf.dir}"/>
|
||||
<pathelement location="${hadoop.root}/build"/>
|
||||
<pathelement location="${src.test}"/>
|
||||
<pathelement location="${root}/conf"/>
|
||||
<pathelement location="${build.dir}"/>
|
||||
<path refid="classpath"/>
|
||||
</path>
|
||||
|
||||
<target name="test">
|
||||
<antcall target="hadoopbuildcontrib.test"/>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -29,12 +29,38 @@
|
|||
TODO: Support 'local' (All running in single context).
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.master.info.port</name>
|
||||
<value>60010</value>
|
||||
<description>The port for the hbase master web UI
|
||||
Set to -1 if you do not want the info server to run.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.master.info.bindAddress</name>
|
||||
<value>0.0.0.0</value>
|
||||
<description>The address for the hbase master web UI
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.regionserver</name>
|
||||
<value>0.0.0.0:60010</value>
|
||||
<value>0.0.0.0:60020</value>
|
||||
<description>The host and port a HBase region server runs at.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.regionserver.info.port</name>
|
||||
<value>60030</value>
|
||||
<description>The port for the hbase regionserver web UI
|
||||
Set to -1 if you do not want the info server to run.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.regionserver.info.bindAddress</name>
|
||||
<value>0.0.0.0</value>
|
||||
<description>The address for the hbase regionserver web UI
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.regionserver.class</name>
|
||||
<value>org.apache.hadoop.hbase.HRegionInterface</value>
|
||||
|
@ -176,4 +202,10 @@
|
|||
if true, enable audible keyboard bells if an alert is required.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbaseshell.formatter</name>
|
||||
<value>org.apache.hadoop.hbase.shell.formatter.AsciiTableFormatter</value>
|
||||
<description>TableFormatter to use outputting HQL result sets.
|
||||
</description>
|
||||
</property>
|
||||
</configuration>
|
||||
|
|
|
@ -47,11 +47,15 @@ public interface HConstants {
|
|||
/** Default master address */
|
||||
static final String DEFAULT_MASTER_ADDRESS = DEFAULT_HOST + ":60000";
|
||||
|
||||
static final int DEFAULT_MASTER_INFOPORT = 60010;
|
||||
|
||||
/** Parameter name for hbase.regionserver address. */
|
||||
static final String REGIONSERVER_ADDRESS = "hbase.regionserver";
|
||||
|
||||
/** Default region server address */
|
||||
static final String DEFAULT_REGIONSERVER_ADDRESS = DEFAULT_HOST + ":60010";
|
||||
static final String DEFAULT_REGIONSERVER_ADDRESS = DEFAULT_HOST + ":60020";
|
||||
|
||||
static final int DEFAULT_REGIONSERVER_INFOPORT = 60030;
|
||||
|
||||
/** Parameter name for what region server interface to use. */
|
||||
static final String REGION_SERVER_CLASS = "hbase.regionserver.class";
|
||||
|
|
|
@ -51,6 +51,13 @@ import org.apache.hadoop.conf.Configuration;
|
|||
import org.apache.hadoop.fs.FileSystem;
|
||||
import org.apache.hadoop.fs.Path;
|
||||
import org.apache.hadoop.fs.PathFilter;
|
||||
import org.apache.hadoop.hbase.io.BatchUpdate;
|
||||
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
|
||||
import org.apache.hadoop.hbase.util.FSUtils;
|
||||
import org.apache.hadoop.hbase.util.InfoServer;
|
||||
import org.apache.hadoop.hbase.util.Sleeper;
|
||||
import org.apache.hadoop.hbase.util.Threads;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
import org.apache.hadoop.io.MapWritable;
|
||||
import org.apache.hadoop.io.Text;
|
||||
import org.apache.hadoop.io.Writable;
|
||||
|
@ -58,13 +65,6 @@ import org.apache.hadoop.ipc.RPC;
|
|||
import org.apache.hadoop.ipc.RemoteException;
|
||||
import org.apache.hadoop.ipc.Server;
|
||||
|
||||
import org.apache.hadoop.hbase.io.BatchUpdate;
|
||||
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
|
||||
import org.apache.hadoop.hbase.util.FSUtils;
|
||||
import org.apache.hadoop.hbase.util.Sleeper;
|
||||
import org.apache.hadoop.hbase.util.Threads;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
|
||||
|
||||
/**
|
||||
* HMaster is the "master server" for a HBase.
|
||||
|
@ -121,6 +121,11 @@ HMasterRegionInterface {
|
|||
// A Sleeper that sleeps for threadWakeFrequency
|
||||
protected Sleeper sleeper;
|
||||
|
||||
// Default access so accesible from unit tests. MASTER is name of the webapp
|
||||
// and the attribute name used stuffing this instance into web context.
|
||||
InfoServer infoServer;
|
||||
public static final String MASTER = "master";
|
||||
|
||||
/**
|
||||
* Base HRegion scanner class. Holds utilty common to <code>ROOT</code> and
|
||||
* <code>META</code> HRegion scanners.
|
||||
|
@ -538,7 +543,7 @@ HMasterRegionInterface {
|
|||
Integer rootScannerLock = new Integer(0);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static class MetaRegion implements Comparable {
|
||||
public static class MetaRegion implements Comparable {
|
||||
private HServerAddress server;
|
||||
private Text regionName;
|
||||
private Text startKey;
|
||||
|
@ -960,12 +965,47 @@ HMasterRegionInterface {
|
|||
return address;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Hbase root dir.
|
||||
*/
|
||||
public Path getRootDir() {
|
||||
return this.dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Read-only map of servers to serverinfo.
|
||||
*/
|
||||
public Map<String, HServerInfo> getServersToServerInfo() {
|
||||
return Collections.unmodifiableMap(this.serversToServerInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Read-only map of servers to load.
|
||||
*/
|
||||
public Map<String, HServerLoad> getServersToLoad() {
|
||||
return Collections.unmodifiableMap(this.serversToLoad);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Location of the <code>-ROOT-</code> region.
|
||||
*/
|
||||
public HServerAddress getRootRegionLocation() {
|
||||
return this.rootRegionLocation.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Read-only map of online regions.
|
||||
*/
|
||||
public Map<Text, MetaRegion> getOnlineMetaRegions() {
|
||||
return Collections.unmodifiableSortedMap(this.onlineMetaRegions);
|
||||
}
|
||||
|
||||
/** Main processing loop */
|
||||
@Override
|
||||
public void run() {
|
||||
final String threadName = "HMaster";
|
||||
Thread.currentThread().setName(threadName);
|
||||
startAllServices();
|
||||
startServiceThreads();
|
||||
/*
|
||||
* Main processing loop
|
||||
*/
|
||||
|
@ -1042,11 +1082,18 @@ HMasterRegionInterface {
|
|||
synchronized(metaScannerLock) {
|
||||
metaScannerThread.interrupt(); // Wake meta scanner
|
||||
}
|
||||
if (this.infoServer != null) {
|
||||
LOG.info("Stopping infoServer");
|
||||
try {
|
||||
this.infoServer.stop();
|
||||
} catch (InterruptedException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
server.stop(); // Stop server
|
||||
serverLeases.close(); // Turn off the lease monitor
|
||||
|
||||
// Join up with all threads
|
||||
|
||||
try {
|
||||
rootScannerThread.join(); // Wait for the root scanner to finish.
|
||||
} catch (Exception iex) {
|
||||
|
@ -1067,7 +1114,7 @@ HMasterRegionInterface {
|
|||
* as OOMEs; it should be lightly loaded. See what HRegionServer does if
|
||||
* need to install an unexpected exception handler.
|
||||
*/
|
||||
private void startAllServices() {
|
||||
private void startServiceThreads() {
|
||||
String threadName = Thread.currentThread().getName();
|
||||
try {
|
||||
Threads.setDaemonThreadRunning(this.rootScannerThread,
|
||||
|
@ -1077,7 +1124,15 @@ HMasterRegionInterface {
|
|||
// Leases are not the same as Chore threads. Set name differently.
|
||||
this.serverLeases.setName(threadName + ".leaseChecker");
|
||||
this.serverLeases.start();
|
||||
// Start the server last so everything else is running before we start
|
||||
// Put up info server.
|
||||
int port = this.conf.getInt("hbase.master.info.port", 60010);
|
||||
if (port >= 0) {
|
||||
String a = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
|
||||
this.infoServer = new InfoServer(MASTER, a, port, false);
|
||||
this.infoServer.setAttribute(MASTER, this);
|
||||
this.infoServer.start();
|
||||
}
|
||||
// Start the server so everything else is running before we start
|
||||
// receiving requests.
|
||||
this.server.start();
|
||||
} catch (IOException e) {
|
||||
|
|
|
@ -488,7 +488,6 @@ public class HMemcache {
|
|||
closeSubScanner(i);
|
||||
}
|
||||
}
|
||||
|
||||
} finally {
|
||||
lock.releaseReadLock();
|
||||
scannerClosed = true;
|
||||
|
|
|
@ -314,7 +314,7 @@ public class HRegion implements HConstants {
|
|||
}
|
||||
|
||||
/** Returns a HRegionInfo object for this region */
|
||||
HRegionInfo getRegionInfo() {
|
||||
public HRegionInfo getRegionInfo() {
|
||||
return this.regionInfo;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ import org.apache.hadoop.hbase.io.BatchOperation;
|
|||
import org.apache.hadoop.hbase.io.BatchUpdate;
|
||||
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
|
||||
import org.apache.hadoop.hbase.util.FSUtils;
|
||||
import org.apache.hadoop.hbase.util.InfoServer;
|
||||
import org.apache.hadoop.hbase.util.Sleeper;
|
||||
import org.apache.hadoop.hbase.util.Threads;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
|
@ -117,6 +118,12 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
// A sleeper that sleeps for msgInterval.
|
||||
private final Sleeper sleeper;
|
||||
|
||||
// Info server. Default access so can be used by unit tests. REGIONSERVER
|
||||
// is name of the webapp and the attribute name used stuffing this instance
|
||||
// into web context.
|
||||
InfoServer infoServer;
|
||||
public static final String REGIONSERVER = "regionserver";
|
||||
|
||||
// Check to see if regions should be split
|
||||
private final Thread splitOrCompactCheckerThread;
|
||||
// Needed at shutdown. On way out, if can get this lock then we are not in
|
||||
|
@ -408,7 +415,8 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
false, conf);
|
||||
this.serverInfo = new HServerInfo(new HServerAddress(
|
||||
new InetSocketAddress(getThisIP(),
|
||||
this.server.getListenerAddress().getPort())), this.rand.nextLong());
|
||||
this.server.getListenerAddress().getPort())), this.rand.nextLong(),
|
||||
this.conf.getInt("hbase.regionserver.info.port", 60030));
|
||||
this.leases = new Leases(
|
||||
conf.getInt("hbase.regionserver.lease.period", 3 * 60 * 1000),
|
||||
this.threadWakeFrequency);
|
||||
|
@ -546,6 +554,14 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
this.leases.closeAfterLeasesExpire();
|
||||
this.worker.stop();
|
||||
this.server.stop();
|
||||
if (this.infoServer != null) {
|
||||
LOG.info("Stopping infoServer");
|
||||
try {
|
||||
this.infoServer.stop();
|
||||
} catch (InterruptedException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// Send interrupts to wake up threads if sleeping so they notice shutdown.
|
||||
// TODO: Should we check they are alive? If OOME could have exited already
|
||||
|
@ -689,6 +705,14 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
// an unhandled exception, it will just exit.
|
||||
this.leases.setName(n + ".leaseChecker");
|
||||
this.leases.start();
|
||||
// Put up info server.
|
||||
int port = this.conf.getInt("hbase.regionserver.info.port", 60030);
|
||||
if (port >= 0) {
|
||||
String a = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
|
||||
this.infoServer = new InfoServer("regionserver", a, port, false);
|
||||
this.infoServer.setAttribute("regionserver", this);
|
||||
this.infoServer.start();
|
||||
}
|
||||
// Start Server. This service is like leases in that it internally runs
|
||||
// a thread.
|
||||
this.server.start();
|
||||
|
@ -1050,7 +1074,7 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
if (s == null) {
|
||||
throw new UnknownScannerException("Name: " + scannerName);
|
||||
}
|
||||
leases.renewLease(scannerId, scannerId);
|
||||
this.leases.renewLease(scannerId, scannerId);
|
||||
|
||||
// Collect values to be returned here
|
||||
MapWritable values = new MapWritable();
|
||||
|
@ -1131,11 +1155,9 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
// remote scanner interface
|
||||
//
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public long openScanner(Text regionName, Text[] cols, Text firstRow,
|
||||
final long timestamp, final RowFilterInterface filter)
|
||||
throws IOException {
|
||||
|
||||
checkOpen();
|
||||
requestCount.incrementAndGet();
|
||||
try {
|
||||
|
@ -1148,7 +1170,8 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
synchronized(scanners) {
|
||||
scanners.put(scannerName, s);
|
||||
}
|
||||
leases.createLease(scannerId, scannerId, new ScannerListener(scannerName));
|
||||
this.leases.
|
||||
createLease(scannerId, scannerId, new ScannerListener(scannerName));
|
||||
return scannerId;
|
||||
} catch (IOException e) {
|
||||
LOG.error("Error opening scanner (fsOk: " + this.fsOk + ")",
|
||||
|
@ -1172,8 +1195,7 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
throw new UnknownScannerException(scannerName);
|
||||
}
|
||||
s.close();
|
||||
leases.cancelLease(scannerId, scannerId);
|
||||
|
||||
this.leases.cancelLease(scannerId, scannerId);
|
||||
} catch (IOException e) {
|
||||
checkFileSystem();
|
||||
throw e;
|
||||
|
@ -1250,6 +1272,24 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
|
|||
region.commit(lockid, timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Info on this server.
|
||||
*/
|
||||
public HServerInfo getServerInfo() {
|
||||
return this.serverInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Immutable list of this servers regions.
|
||||
*/
|
||||
public SortedMap<Text, HRegion> getOnlineRegions() {
|
||||
return Collections.unmodifiableSortedMap(this.onlineRegions);
|
||||
}
|
||||
|
||||
public AtomicInteger getRequestCount() {
|
||||
return this.requestCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Protected utility method for safely obtaining an HRegion handle.
|
||||
* @param regionName Name of online {@link HRegion} to return
|
||||
|
|
|
@ -34,23 +34,25 @@ public class HServerInfo implements Writable {
|
|||
private HServerAddress serverAddress;
|
||||
private long startCode;
|
||||
private HServerLoad load;
|
||||
private int infoPort;
|
||||
|
||||
/** default constructor - used by Writable */
|
||||
public HServerInfo() {
|
||||
this.serverAddress = new HServerAddress();
|
||||
this.startCode = 0;
|
||||
this.load = new HServerLoad();
|
||||
this(new HServerAddress(), 0, HConstants.DEFAULT_REGIONSERVER_INFOPORT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param serverAddress
|
||||
* @param startCode
|
||||
* @param infoPort Port the info server is listening on.
|
||||
*/
|
||||
public HServerInfo(HServerAddress serverAddress, long startCode) {
|
||||
this.serverAddress = new HServerAddress(serverAddress);
|
||||
public HServerInfo(HServerAddress serverAddress, long startCode,
|
||||
final int infoPort) {
|
||||
this.serverAddress = serverAddress;
|
||||
this.startCode = startCode;
|
||||
this.load = new HServerLoad();
|
||||
this.infoPort = infoPort;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -61,6 +63,7 @@ public class HServerInfo implements Writable {
|
|||
this.serverAddress = new HServerAddress(other.getServerAddress());
|
||||
this.startCode = other.getStartCode();
|
||||
this.load = other.getLoad();
|
||||
this.infoPort = other.getInfoPort();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,6 +90,13 @@ public class HServerInfo implements Writable {
|
|||
return startCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Port the info server is listening on.
|
||||
*/
|
||||
public int getInfoPort() {
|
||||
return this.infoPort;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param startCode the startCode to set
|
||||
*/
|
||||
|
@ -101,13 +111,40 @@ public class HServerInfo implements Writable {
|
|||
+ ", load: (" + this.load.toString() + ")";
|
||||
}
|
||||
|
||||
// Writable
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof HServerInfo)) {
|
||||
return false;
|
||||
}
|
||||
HServerInfo that = (HServerInfo)obj;
|
||||
if (!this.serverAddress.equals(that.serverAddress)) {
|
||||
return false;
|
||||
}
|
||||
if (this.infoPort != that.infoPort) {
|
||||
return false;
|
||||
}
|
||||
if (this.startCode != that.startCode) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = this.serverAddress.hashCode();
|
||||
result ^= this.infoPort;
|
||||
result ^= this.startCode;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// Writable
|
||||
/** {@inheritDoc} */
|
||||
public void readFields(DataInput in) throws IOException {
|
||||
this.serverAddress.readFields(in);
|
||||
this.startCode = in.readLong();
|
||||
this.load.readFields(in);
|
||||
this.infoPort = in.readInt();
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
|
@ -115,5 +152,6 @@ public class HServerInfo implements Writable {
|
|||
this.serverAddress.write(out);
|
||||
out.writeLong(this.startCode);
|
||||
this.load.write(out);
|
||||
out.writeInt(this.infoPort);
|
||||
}
|
||||
}
|
|
@ -87,7 +87,8 @@ public class Leases {
|
|||
public void closeAfterLeasesExpire() {
|
||||
synchronized(this.leases) {
|
||||
while (this.leases.size() > 0) {
|
||||
LOG.info(Integer.toString(leases.size()) + " lease(s) " +
|
||||
LOG.info(Thread.currentThread().getName() + " " +
|
||||
Integer.toString(leases.size()) + " lease(s) " +
|
||||
"outstanding. Waiting for them to expire.");
|
||||
try {
|
||||
this.leases.wait(this.leaseCheckFrequency);
|
||||
|
@ -105,7 +106,7 @@ public class Leases {
|
|||
* without any cancellation calls.
|
||||
*/
|
||||
public void close() {
|
||||
LOG.info("closing leases");
|
||||
LOG.info(Thread.currentThread().getName() + " closing leases");
|
||||
this.stop.set(true);
|
||||
try {
|
||||
this.leaseMonitorThread.interrupt();
|
||||
|
@ -119,7 +120,7 @@ public class Leases {
|
|||
sortedLeases.clear();
|
||||
}
|
||||
}
|
||||
LOG.info("leases closed");
|
||||
LOG.info(Thread.currentThread().getName() + " closed leases");
|
||||
}
|
||||
|
||||
/* A client obtains a lease... */
|
||||
|
@ -330,8 +331,8 @@ public class Leases {
|
|||
}
|
||||
|
||||
void expired() {
|
||||
LOG.info("Lease expired " + getLeaseName());
|
||||
|
||||
LOG.info(Thread.currentThread().getName() + " lease expired " +
|
||||
getLeaseName());
|
||||
listener.leaseExpired();
|
||||
}
|
||||
|
||||
|
|
|
@ -20,13 +20,16 @@
|
|||
package org.apache.hadoop.hbase;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
|
||||
import jline.ConsoleReader;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.shell.Command;
|
||||
import org.apache.hadoop.hbase.shell.HelpManager;
|
||||
import org.apache.hadoop.hbase.shell.HelpCommand;
|
||||
import org.apache.hadoop.hbase.shell.ReturnMsg;
|
||||
import org.apache.hadoop.hbase.shell.TableFormatterFactory;
|
||||
import org.apache.hadoop.hbase.shell.generated.ParseException;
|
||||
import org.apache.hadoop.hbase.shell.generated.Parser;
|
||||
import org.apache.hadoop.hbase.shell.generated.TokenMgrError;
|
||||
|
@ -40,6 +43,30 @@ public class Shell {
|
|||
/** audible keyboard bells */
|
||||
public static final boolean DEFAULT_BELL_ENABLED = true;
|
||||
|
||||
|
||||
/** Return the boolean value indicating whether end of command or not */
|
||||
static boolean isEndOfCommand(String line) {
|
||||
return (line.lastIndexOf(';') > -1) ? true : false;
|
||||
}
|
||||
|
||||
/** Return the string of prompt start string */
|
||||
private static String getPrompt(final StringBuilder queryStr) {
|
||||
return (queryStr.toString().equals("")) ? "Hbase> " : " --> ";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param watch true if execution time should be computed and returned
|
||||
* @param start start of time interval
|
||||
* @param end end of time interval
|
||||
* @return a string of code execution time. */
|
||||
public static String executeTime(boolean watch, long start, long end) {
|
||||
return watch?
|
||||
" (" + String.format("%.2f", Double.valueOf((end - start) * 0.001)) +
|
||||
" sec)":
|
||||
"";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Main method
|
||||
* @param args not used
|
||||
|
@ -51,7 +78,9 @@ public class Shell {
|
|||
ConsoleReader reader = new ConsoleReader();
|
||||
reader.setBellEnabled(conf.getBoolean("hbaseshell.jline.bell.enabled",
|
||||
DEFAULT_BELL_ENABLED));
|
||||
HelpManager help = new HelpManager();
|
||||
Writer out = new OutputStreamWriter(System.out, "UTF-8");
|
||||
TableFormatterFactory tff = new TableFormatterFactory(out, conf);
|
||||
HelpCommand help = new HelpCommand(out, tff.get());
|
||||
help.printVersion();
|
||||
StringBuilder queryStr = new StringBuilder();
|
||||
String extendedLine;
|
||||
|
@ -59,7 +88,7 @@ public class Shell {
|
|||
if (isEndOfCommand(extendedLine)) {
|
||||
queryStr.append(" " + extendedLine);
|
||||
long start = System.currentTimeMillis();
|
||||
Parser parser = new Parser(queryStr.toString());
|
||||
Parser parser = new Parser(queryStr.toString(), out, tff.get());
|
||||
ReturnMsg rs = null;
|
||||
try {
|
||||
Command cmd = parser.terminatedCommand();
|
||||
|
@ -85,26 +114,4 @@ public class Shell {
|
|||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
/** Return the boolean value indicating whether end of command or not */
|
||||
static boolean isEndOfCommand(String line) {
|
||||
return (line.lastIndexOf(';') > -1) ? true : false;
|
||||
}
|
||||
|
||||
/** Return the string of prompt start string */
|
||||
private static String getPrompt(final StringBuilder queryStr) {
|
||||
return (queryStr.toString().equals("")) ? "Hbase> " : " --> ";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param watch true if execution time should be computed and returned
|
||||
* @param start start of time interval
|
||||
* @param end end of time interval
|
||||
* @return a string of code execution time. */
|
||||
public static String executeTime(boolean watch, long start, long end) {
|
||||
return watch?
|
||||
" (" + String.format("%.2f", Double.valueOf((end - start) * 0.001)) +
|
||||
" sec)":
|
||||
"";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
@ -33,7 +34,6 @@ import org.apache.hadoop.io.Text;
|
|||
* Alters tables.
|
||||
*/
|
||||
public class AlterCommand extends SchemaModificationCommand {
|
||||
|
||||
public enum OperationType {ADD, DROP, CHANGE, NOOP}
|
||||
private OperationType operationType = OperationType.NOOP;
|
||||
private Map<String, Map<String, Object>> columnSpecMap =
|
||||
|
@ -41,6 +41,10 @@ public class AlterCommand extends SchemaModificationCommand {
|
|||
private String table;
|
||||
private String column; // column to be dropped
|
||||
|
||||
public AlterCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
try {
|
||||
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||
|
@ -52,7 +56,7 @@ public class AlterCommand extends SchemaModificationCommand {
|
|||
columns = columnSpecMap.keySet();
|
||||
for (String c : columns) {
|
||||
columnDesc = getColumnDescriptor(c, columnSpecMap.get(c));
|
||||
System.out.println("Adding " + c + " to " + table +
|
||||
println("Adding " + c + " to " + table +
|
||||
"... Please wait.");
|
||||
admin.addColumn(new Text(table), columnDesc);
|
||||
}
|
||||
|
@ -60,7 +64,7 @@ public class AlterCommand extends SchemaModificationCommand {
|
|||
break;
|
||||
case DROP:
|
||||
disableTable(admin, table);
|
||||
System.out.println("Dropping " + column + " from " + table +
|
||||
println("Dropping " + column + " from " + table +
|
||||
"... Please wait.");
|
||||
column = appendDelimiter(column);
|
||||
admin.deleteColumn(new Text(table), new Text(column));
|
||||
|
@ -79,12 +83,12 @@ public class AlterCommand extends SchemaModificationCommand {
|
|||
}
|
||||
|
||||
private void disableTable(HBaseAdmin admin, String t) throws IOException {
|
||||
System.out.println("Disabling " + t + "... Please wait.");
|
||||
println("Disabling " + t + "... Please wait.");
|
||||
admin.disableTable(new Text(t));
|
||||
}
|
||||
|
||||
private void enableTable(HBaseAdmin admin, String t) throws IOException {
|
||||
System.out.println("Enabling " + t + "... Please wait.");
|
||||
println("Enabling " + t + "... Please wait.");
|
||||
admin.enableTable(new Text(t));
|
||||
}
|
||||
|
||||
|
@ -124,4 +128,9 @@ public class AlterCommand extends SchemaModificationCommand {
|
|||
public void setOperationType(OperationType operationType) {
|
||||
this.operationType = operationType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DDL;
|
||||
}
|
||||
}
|
|
@ -19,10 +19,31 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
/**
|
||||
* Takes the lowest-common-denominator {@link Writer} doing its own printlns,
|
||||
* etc.
|
||||
* @see <a href="http://wiki.apache.org/lucene-hadoop/Hbase/HbaseShell">HBaseShell</a>
|
||||
*/
|
||||
public abstract class BasicCommand implements Command, CommandFactory {
|
||||
private final Writer out;
|
||||
public final String LINE_SEPARATOR = System.getProperty("line.separator");
|
||||
|
||||
// Shutdown constructor.
|
||||
@SuppressWarnings("unused")
|
||||
private BasicCommand() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param o A Writer.
|
||||
*/
|
||||
public BasicCommand(final Writer o) {
|
||||
this.out = o;
|
||||
}
|
||||
|
||||
public BasicCommand getBasicCommand() {
|
||||
return this;
|
||||
|
@ -51,4 +72,25 @@ public abstract class BasicCommand implements Command, CommandFactory {
|
|||
return (!column.endsWith(FAMILY_INDICATOR))?
|
||||
column + FAMILY_INDICATOR: column;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Writer to use outputting.
|
||||
*/
|
||||
public Writer getOut() {
|
||||
return this.out;
|
||||
}
|
||||
|
||||
public void print(final String msg) throws IOException {
|
||||
this.out.write(msg);
|
||||
}
|
||||
|
||||
public void println(final String msg) throws IOException {
|
||||
print(msg);
|
||||
print(LINE_SEPARATOR);
|
||||
this.out.flush();
|
||||
}
|
||||
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.SELECT;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
||||
|
@ -27,21 +28,38 @@ import org.apache.hadoop.conf.Configuration;
|
|||
* Clears the console screen.
|
||||
*/
|
||||
public class ClearCommand extends BasicCommand {
|
||||
public ClearCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(@SuppressWarnings("unused") Configuration conf) {
|
||||
clear();
|
||||
return null;
|
||||
}
|
||||
|
||||
static void clear() {
|
||||
private void clear() {
|
||||
String osName = System.getProperty("os.name");
|
||||
if (osName.length() > 7 && osName.subSequence(0, 7).equals("Windows")) {
|
||||
try {
|
||||
Runtime.getRuntime().exec("cmd /C cls");
|
||||
} catch (IOException e) {
|
||||
System.out.println("Can't clear." + e.toString());
|
||||
try {
|
||||
println("Can't clear." + e.toString());
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
System.out.print("\033c");
|
||||
try {
|
||||
print("\033c");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.SHELL;
|
||||
}
|
||||
}
|
|
@ -25,9 +25,17 @@ public interface Command {
|
|||
/** family indicator */
|
||||
public static final String FAMILY_INDICATOR = ":";
|
||||
|
||||
public enum CommandType {DDL, UPDATE, SELECT, INSERT, DELETE, SHELL}
|
||||
|
||||
/** Execute a command
|
||||
* @param conf Configuration
|
||||
* @return Result of command execution
|
||||
*/
|
||||
public ReturnMsg execute(Configuration conf);
|
||||
public ReturnMsg execute(final Configuration conf);
|
||||
|
||||
/**
|
||||
* @return Type of this command whether DDL, SELECT, INSERT, UPDATE, DELETE,
|
||||
* or SHELL.
|
||||
*/
|
||||
public CommandType getCommandType();
|
||||
}
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
@ -32,11 +33,14 @@ import org.apache.hadoop.hbase.HTableDescriptor;
|
|||
* Creates tables.
|
||||
*/
|
||||
public class CreateCommand extends SchemaModificationCommand {
|
||||
|
||||
private String tableName;
|
||||
private Map<String, Map<String, Object>> columnSpecMap =
|
||||
new HashMap<String, Map<String, Object>>();
|
||||
|
||||
public CreateCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
try {
|
||||
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||
|
@ -48,7 +52,7 @@ public class CreateCommand extends SchemaModificationCommand {
|
|||
tableDesc.addFamily(columnDesc);
|
||||
}
|
||||
|
||||
System.out.println("Creating table... Please wait.");
|
||||
println("Creating table... Please wait.");
|
||||
|
||||
admin.createTable(tableDesc);
|
||||
return new ReturnMsg(0, "Table created successfully.");
|
||||
|
@ -73,4 +77,9 @@ public class CreateCommand extends SchemaModificationCommand {
|
|||
public void addColumnSpec(String column, Map<String, Object> columnSpec) {
|
||||
columnSpecMap.put(column, columnSpec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DDL;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -32,6 +33,9 @@ import org.apache.hadoop.io.Text;
|
|||
* Deletes values from tables.
|
||||
*/
|
||||
public class DeleteCommand extends BasicCommand {
|
||||
public DeleteCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
private String tableName;
|
||||
private String rowKey;
|
||||
|
@ -100,4 +104,9 @@ public class DeleteCommand extends BasicCommand {
|
|||
}
|
||||
return columns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DELETE;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.HColumnDescriptor;
|
||||
|
@ -35,8 +36,20 @@ public class DescCommand extends BasicCommand {
|
|||
private static final String [] HEADER =
|
||||
new String [] {"Column Family Descriptor"};
|
||||
private Text tableName;
|
||||
private final TableFormatter formatter;
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
// Not instantiable
|
||||
@SuppressWarnings("unused")
|
||||
private DescCommand() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public DescCommand(final Writer o, final TableFormatter f) {
|
||||
super(o);
|
||||
this.formatter = f;
|
||||
}
|
||||
|
||||
public ReturnMsg execute(final Configuration conf) {
|
||||
if (this.tableName == null)
|
||||
return new ReturnMsg(0, "Syntax error : Please check 'Describe' syntax");
|
||||
try {
|
||||
|
@ -53,7 +66,6 @@ public class DescCommand extends BasicCommand {
|
|||
break;
|
||||
}
|
||||
}
|
||||
TableFormatter formatter = TableFormatterFactory.get();
|
||||
formatter.header(HEADER);
|
||||
// Do a toString on the HColumnDescriptors
|
||||
String [] columnStrs = new String[columns.length];
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.HBaseAdmin;
|
||||
|
@ -31,6 +32,10 @@ import org.apache.hadoop.io.Text;
|
|||
public class DisableCommand extends BasicCommand {
|
||||
private String tableName;
|
||||
|
||||
public DisableCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
assert tableName != null;
|
||||
|
||||
|
@ -48,4 +53,9 @@ public class DisableCommand extends BasicCommand {
|
|||
public void setTable(String table) {
|
||||
this.tableName = table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DDL;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
@ -32,6 +33,10 @@ import org.apache.hadoop.io.Text;
|
|||
public class DropCommand extends BasicCommand {
|
||||
private List<String> tableList;
|
||||
|
||||
public DropCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
if (tableList == null) {
|
||||
throw new IllegalArgumentException("List of tables is null");
|
||||
|
@ -41,7 +46,7 @@ public class DropCommand extends BasicCommand {
|
|||
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||
|
||||
for (String table : tableList) {
|
||||
System.out.println("Dropping " + table + "... Please wait.");
|
||||
println("Dropping " + table + "... Please wait.");
|
||||
admin.deleteTable(new Text(table));
|
||||
}
|
||||
|
||||
|
@ -54,4 +59,9 @@ public class DropCommand extends BasicCommand {
|
|||
public void setTableList(List<String> tableList) {
|
||||
this.tableList = tableList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DDL;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.HBaseAdmin;
|
||||
|
@ -31,12 +32,15 @@ import org.apache.hadoop.io.Text;
|
|||
public class EnableCommand extends BasicCommand {
|
||||
private String tableName;
|
||||
|
||||
public EnableCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
assert tableName != null;
|
||||
try {
|
||||
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||
admin.enableTable(new Text(tableName));
|
||||
|
||||
return new ReturnMsg(1, "Table enabled successfully.");
|
||||
} catch (IOException e) {
|
||||
String[] msg = e.getMessage().split("[\n]");
|
||||
|
@ -47,4 +51,9 @@ public class EnableCommand extends BasicCommand {
|
|||
public void setTable(String table) {
|
||||
this.tableName = table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.DDL;
|
||||
}
|
||||
}
|
|
@ -19,9 +19,14 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
||||
public class ExitCommand extends BasicCommand {
|
||||
public ExitCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(@SuppressWarnings("unused") Configuration conf) {
|
||||
// TOD: Is this the best way to exit? Would be a problem if shell is run
|
||||
|
@ -29,4 +34,9 @@ public class ExitCommand extends BasicCommand {
|
|||
System.exit(1);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.SHELL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
@ -31,7 +32,12 @@ import org.apache.hadoop.util.ToolRunner;
|
|||
public class FsCommand extends BasicCommand {
|
||||
private List<String> query;
|
||||
|
||||
public FsCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(@SuppressWarnings("unused") Configuration conf) {
|
||||
// This commmand will write the
|
||||
FsShell shell = new FsShell();
|
||||
try {
|
||||
ToolRunner.run(shell, getQuery());
|
||||
|
@ -49,4 +55,9 @@ public class FsCommand extends BasicCommand {
|
|||
private String[] getQuery() {
|
||||
return query.toArray(new String[] {});
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.SHELL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ import java.util.Map;
|
|||
import java.util.HashMap;
|
||||
import java.io.StringReader;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.hbase.shell.*;
|
||||
|
||||
|
@ -40,10 +41,14 @@ import org.apache.hadoop.hbase.shell.*;
|
|||
*/
|
||||
public class Parser {
|
||||
private String QueryString;
|
||||
private TableFormatter formatter;
|
||||
private Writer out;
|
||||
|
||||
public Parser(String query) {
|
||||
public Parser(final String query, final Writer o, final TableFormatter f) {
|
||||
this((Reader)(new StringReader(query)));
|
||||
this.QueryString = query;
|
||||
this.formatter = f;
|
||||
this.out = o;
|
||||
}
|
||||
|
||||
public String getQueryStr() {
|
||||
|
@ -174,7 +179,7 @@ Command cmdStatement() :
|
|||
|
||||
ExitCommand exitCommand() :
|
||||
{
|
||||
ExitCommand exit = new ExitCommand();
|
||||
ExitCommand exit = new ExitCommand(this.out);
|
||||
}
|
||||
{
|
||||
<EXIT> { return exit; }
|
||||
|
@ -183,7 +188,7 @@ ExitCommand exitCommand() :
|
|||
FsCommand fsCommand() :
|
||||
{
|
||||
Token t = null;
|
||||
FsCommand fs = new FsCommand();
|
||||
FsCommand fs = new FsCommand(this.out);
|
||||
List<String> query = new ArrayList<String>();
|
||||
}
|
||||
{
|
||||
|
@ -202,7 +207,7 @@ FsCommand fsCommand() :
|
|||
JarCommand jarCommand() :
|
||||
{
|
||||
Token t = null;
|
||||
JarCommand jar = new JarCommand();
|
||||
JarCommand jar = new JarCommand(this.out);
|
||||
List<String> query = new ArrayList<String>();
|
||||
}
|
||||
{
|
||||
|
@ -221,7 +226,7 @@ JarCommand jarCommand() :
|
|||
HelpCommand helpCommand() :
|
||||
{
|
||||
Token t = null;
|
||||
HelpCommand help = new HelpCommand();
|
||||
HelpCommand help = new HelpCommand(this.out, this.formatter);
|
||||
String argument = "";
|
||||
}
|
||||
{
|
||||
|
@ -252,7 +257,7 @@ HelpCommand helpCommand() :
|
|||
|
||||
ShowCommand showCommand() :
|
||||
{
|
||||
ShowCommand show = new ShowCommand();
|
||||
ShowCommand show = new ShowCommand(this.out, this.formatter);
|
||||
String argument = null;
|
||||
}
|
||||
{
|
||||
|
@ -268,7 +273,7 @@ ShowCommand showCommand() :
|
|||
|
||||
DescCommand descCommand() :
|
||||
{
|
||||
DescCommand desc = new DescCommand();
|
||||
DescCommand desc = new DescCommand(this.out, this.formatter);
|
||||
String argument = null;
|
||||
}
|
||||
{
|
||||
|
@ -347,7 +352,7 @@ Map<String, Object> ColumnSpec() :
|
|||
|
||||
CreateCommand createCommand() :
|
||||
{
|
||||
CreateCommand createCommand = new CreateCommand();
|
||||
CreateCommand createCommand = new CreateCommand(this.out);
|
||||
String table = null;
|
||||
Map<String, Object> columnSpec = null;
|
||||
String column = null;
|
||||
|
@ -383,7 +388,7 @@ CreateCommand createCommand() :
|
|||
|
||||
AlterCommand alterCommand() :
|
||||
{
|
||||
AlterCommand alterCommand = new AlterCommand();
|
||||
AlterCommand alterCommand = new AlterCommand(this.out);
|
||||
String table = null;
|
||||
String column = null;
|
||||
Map<String, Object> columnSpec = null;
|
||||
|
@ -439,7 +444,7 @@ AlterCommand alterCommand() :
|
|||
|
||||
DropCommand dropCommand() :
|
||||
{
|
||||
DropCommand drop = new DropCommand();
|
||||
DropCommand drop = new DropCommand(this.out);
|
||||
List<String> tableList = null;
|
||||
}
|
||||
{
|
||||
|
@ -454,7 +459,7 @@ DropCommand dropCommand() :
|
|||
|
||||
InsertCommand insertCommand() :
|
||||
{
|
||||
InsertCommand in = new InsertCommand();
|
||||
InsertCommand in = new InsertCommand(this.out);
|
||||
List<String> columnfamilies = null;
|
||||
List<String> values = null;
|
||||
String table = null;
|
||||
|
@ -490,7 +495,7 @@ InsertCommand insertCommand() :
|
|||
|
||||
DeleteCommand deleteCommand() :
|
||||
{
|
||||
DeleteCommand deleteCommand = new DeleteCommand();
|
||||
DeleteCommand deleteCommand = new DeleteCommand(this.out);
|
||||
List<String> columnList = null;
|
||||
Token t = null;
|
||||
String table = null;
|
||||
|
@ -519,7 +524,7 @@ DeleteCommand deleteCommand() :
|
|||
|
||||
SelectCommand selectCommand() :
|
||||
{
|
||||
SelectCommand select = new SelectCommand();
|
||||
SelectCommand select = new SelectCommand(this.out, this.formatter);
|
||||
List<String> columns = null;
|
||||
String rowKey = "";
|
||||
String timestamp = null;
|
||||
|
@ -573,7 +578,7 @@ SelectCommand selectCommand() :
|
|||
|
||||
EnableCommand enableCommand() :
|
||||
{
|
||||
EnableCommand enableCommand = new EnableCommand();
|
||||
EnableCommand enableCommand = new EnableCommand(this.out);
|
||||
String table = null;
|
||||
}
|
||||
{
|
||||
|
@ -587,7 +592,7 @@ EnableCommand enableCommand() :
|
|||
|
||||
DisableCommand disableCommand() :
|
||||
{
|
||||
DisableCommand disableCommand = new DisableCommand();
|
||||
DisableCommand disableCommand = new DisableCommand(this.out);
|
||||
String table = null;
|
||||
}
|
||||
{
|
||||
|
@ -601,7 +606,7 @@ DisableCommand disableCommand() :
|
|||
|
||||
ClearCommand clearCommand() :
|
||||
{
|
||||
ClearCommand clear = new ClearCommand();
|
||||
ClearCommand clear = new ClearCommand(this.out);
|
||||
}
|
||||
{
|
||||
<CLEAR>
|
||||
|
|
|
@ -19,17 +19,164 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.io.Writer;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.HBaseConfiguration;
|
||||
|
||||
public class HelpCommand extends BasicCommand {
|
||||
private String argument;
|
||||
private static final String [] HEADER =
|
||||
new String [] {"Command", "Description", "Example"};
|
||||
|
||||
/** application name */
|
||||
public static final String APP_NAME = "Hbase Shell";
|
||||
|
||||
/** version of the code */
|
||||
public static final String APP_VERSION = "0.0.2";
|
||||
|
||||
/** help contents map */
|
||||
public final Map<String, String[]> help =
|
||||
new HashMap<String, String[]>();
|
||||
|
||||
private final TableFormatter formatter;
|
||||
|
||||
public HelpCommand(final Writer o, final TableFormatter f) {
|
||||
super(o);
|
||||
this.help.putAll(load());
|
||||
this.formatter = f;
|
||||
}
|
||||
|
||||
public ReturnMsg execute(@SuppressWarnings("unused") Configuration conf) {
|
||||
HelpManager.printHelp(this.argument);
|
||||
try {
|
||||
printHelp(this.argument);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setArgument(String argument) {
|
||||
this.argument = argument;
|
||||
}
|
||||
|
||||
/**
|
||||
* add help contents
|
||||
*/
|
||||
private Map<? extends String, ? extends String[]> load() {
|
||||
Map<String, String[]> load = new HashMap<String, String[]>();
|
||||
load.put("SHOW", new String[] {"List all user tables", "SHOW TABLES;"});
|
||||
|
||||
load.put("FS", new String[] { "Hadoop FsShell; entering a lone 'FS;' " +
|
||||
"will emit usage",
|
||||
"FS -copyFromLocal /home/user/backup.dat fs/user/backup;"});
|
||||
|
||||
load.put("JAR", new String[] { "Hadoop RunJar util",
|
||||
"JAR ./build/hadoop-examples.jar pi 10 10;"});
|
||||
load.put("CLEAR", new String[] {"Clear the screen", "CLEAR;"} );
|
||||
|
||||
load.put("DESCRIBE", new String[] { "Print table information",
|
||||
"[DESCRIBE|DESC] table_name;"});
|
||||
|
||||
load.put("CREATE", new String[] {
|
||||
"Create tables",
|
||||
"CREATE TABLE table_name (column_family_name [MAX_VERSIONS=n] " +
|
||||
"[MAX_LENGTH=n] [COMPRESSION=NONE|RECORD|BLOCK] [IN_MEMORY] " +
|
||||
"[BLOOMFILTER=NONE|BLOOM|COUNTING|RETOUCHED VECTOR_SIZE=n NUM_HASH=n], " +
|
||||
"...)"
|
||||
});
|
||||
load.put("DROP", new String[] {
|
||||
"Drop tables",
|
||||
"DROP TABLE table_name [, table_name] ...;"});
|
||||
|
||||
load.put("INSERT", new String[] {
|
||||
"Insert values into table",
|
||||
"INSERT INTO table_name (column_name, ...) " +
|
||||
"VALUES ('value', ...) WHERE row='row_key';"
|
||||
});
|
||||
|
||||
load.put("DELETE", new String[] {
|
||||
"Delete table data",
|
||||
"DELETE {column_name, [, column_name] ... | *} FROM table_name " +
|
||||
"WHERE row='row-key';"
|
||||
});
|
||||
|
||||
load.put("SELECT",
|
||||
new String[] {
|
||||
"Select values from table",
|
||||
"SELECT {column_name, [, column_name] ... | *} FROM table_name " +
|
||||
"[WHERE row='row_key' | STARTING FROM 'row-key'] " +
|
||||
"[NUM_VERSIONS = version_count] " +
|
||||
"[TIMESTAMP 'timestamp'] " +
|
||||
"[LIMIT = row_count] " +
|
||||
"[INTO FILE 'file_name'];"
|
||||
});
|
||||
|
||||
load.put("ALTER",
|
||||
new String[] {
|
||||
"Alter structure of table",
|
||||
"ALTER TABLE table_name ADD column_spec | " +
|
||||
"ADD (column_spec, column_spec, ...) | " +
|
||||
"DROP column_family_name | " +
|
||||
"CHANGE column_spec;"
|
||||
});
|
||||
|
||||
load.put("EXIT", new String[] { "Exit shell", "EXIT;"});
|
||||
|
||||
return load;
|
||||
}
|
||||
|
||||
/** Print out the program version.
|
||||
* @throws IOException */
|
||||
public void printVersion() throws IOException {
|
||||
println(APP_NAME + ", " + APP_VERSION + " version.\n"
|
||||
+ "Copyright (c) 2007 by udanax, "
|
||||
+ "licensed to Apache Software Foundation.\n"
|
||||
+ "Type 'help;' for usage.\n");
|
||||
}
|
||||
|
||||
public void printHelp(final String cmd) throws IOException {
|
||||
if (cmd.equals("")) {
|
||||
println("Type 'help COMMAND;' to see command-specific usage.");
|
||||
printHelp(this.help);
|
||||
} else {
|
||||
if (this.help.containsKey(cmd.toUpperCase())) {
|
||||
final Map<String, String []> m = new HashMap<String, String []>();
|
||||
m.put(cmd.toUpperCase(), this.help.get(cmd.toUpperCase()));
|
||||
printHelp(m);
|
||||
} else {
|
||||
println("Unknown Command : Type 'help;' for usage.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void printHelp(final Map<String, String []> m) throws IOException {
|
||||
this.formatter.header(HEADER);
|
||||
for (Map.Entry<String, String []> e: m.entrySet()) {
|
||||
String [] value = e.getValue();
|
||||
if (value.length == 2) {
|
||||
this.formatter.row(new String [] {e.getKey().toUpperCase(), value[0],
|
||||
value[1]});
|
||||
} else {
|
||||
throw new IOException("Value has too many elements:" + value);
|
||||
}
|
||||
}
|
||||
this.formatter.footer();
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws UnsupportedEncodingException {
|
||||
HBaseConfiguration conf = new HBaseConfiguration();
|
||||
Writer out = new OutputStreamWriter(System.out, "UTF-8");
|
||||
TableFormatterFactory tff = new TableFormatterFactory(out, conf);
|
||||
HelpCommand cmd = new HelpCommand(out, tff.get());
|
||||
cmd.setArgument("");
|
||||
cmd.execute(conf);
|
||||
cmd.setArgument("select");
|
||||
cmd.execute(conf);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,112 +0,0 @@
|
|||
/**
|
||||
* Copyright 2007 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.shell;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class HelpContents {
|
||||
|
||||
/**
|
||||
* add help contents
|
||||
*/
|
||||
public static Map<? extends String, ? extends String[]> Load() {
|
||||
Map<String, String[]> load = new HashMap<String, String[]>();
|
||||
|
||||
String columnName = "column_name: "
|
||||
+ "\n\t column_family_name"
|
||||
+ "\n\t| column_family_name:column_label_name";
|
||||
String columnList = "{column_name, [, column_name] ... | *}";
|
||||
|
||||
load.put("SHOW", new String[] {"List all available tables", "SHOW TABLES;"});
|
||||
|
||||
load.put("FS", new String[] { "Hadoop FsShell operations",
|
||||
"FS -copyFromLocal /home/user/backup.dat fs/user/backup;" });
|
||||
|
||||
load.put("JAR", new String[] { "Hadoop RunJar util",
|
||||
"JAR ./build/hadoop-examples.jar pi 10 10;" });
|
||||
|
||||
load.put("CLEAR", new String[] {"Clear the screen", "CLEAR;"} );
|
||||
|
||||
load.put("DESCRIBE", new String[] { "Print information about tables",
|
||||
"[DESCRIBE|DESC] table_name;" });
|
||||
|
||||
load.put("CREATE", new String[] {
|
||||
"Create tables",
|
||||
"CREATE TABLE table_name"
|
||||
+ "\n\t(column_family_spec [, column_family_spec] ...);"
|
||||
+ "\n\n"
|
||||
+ "column_family_spec:"
|
||||
+ "\n\tcolumn_family_name"
|
||||
+ "\n\t[MAX_VERSIONS=n]"
|
||||
+ "\n\t[MAX_LENGTH=n]"
|
||||
+ "\n\t[COMPRESSION=NONE|RECORD|BLOCK]"
|
||||
+ "\n\t[IN_MEMORY]"
|
||||
+ "\n\t[BLOOMFILTER=NONE|BLOOM|COUNTING|RETOUCHED VECTOR_SIZE=n NUM_HASH=n]"
|
||||
});
|
||||
|
||||
load.put("DROP", new String[] {
|
||||
"Drop tables",
|
||||
"DROP TABLE table_name [, table_name] ...;" });
|
||||
|
||||
load.put("INSERT", new String[] {
|
||||
"Insert values into tables",
|
||||
"INSERT INTO table_name"
|
||||
+ "\n\t(column_name, ...) VALUES ('value', ...)"
|
||||
+ "\n\tWHERE row='row_key';"
|
||||
+ "\n\n" + columnName
|
||||
});
|
||||
|
||||
load.put("DELETE", new String[] {
|
||||
"Delete a subset of the data in a table",
|
||||
"DELETE " + columnList
|
||||
+ "\n\tFROM table_name"
|
||||
+ "\n\tWHERE row='row-key';"
|
||||
+ "\n\n"
|
||||
+ columnName
|
||||
});
|
||||
|
||||
load.put("SELECT",
|
||||
new String[] {
|
||||
"Select values from tables",
|
||||
"SELECT " + columnList + " FROM table_name"
|
||||
+ "\n\t[WHERE row='row_key' | STARTING FROM 'row-key']"
|
||||
+ "\n\t[NUM_VERSIONS = version_count]"
|
||||
+ "\n\t[TIMESTAMP 'timestamp']"
|
||||
+ "\n\t[LIMIT = row_count]"
|
||||
+ "\n\t[INTO FILE 'file_name'];"
|
||||
});
|
||||
|
||||
load.put("ALTER",
|
||||
new String[] {
|
||||
"Alter the structure of a table",
|
||||
"ALTER TABLE table_name"
|
||||
+ "\n\t ADD column_spec"
|
||||
+ "\n\t| ADD (column_spec, column_spec, ...)"
|
||||
+ "\n\t| DROP column_family_name"
|
||||
+ "\n\t| CHANGE column_spec;"
|
||||
});
|
||||
|
||||
load.put("EXIT", new String[] { "Exit shell", "EXIT;" });
|
||||
|
||||
return load;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/**
|
||||
* Copyright 2007 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.shell;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Prints a usage message for the program to the given stream.
|
||||
*/
|
||||
public class HelpManager {
|
||||
/** application name */
|
||||
public static final String APP_NAME = "Hbase Shell";
|
||||
|
||||
/** version of the code */
|
||||
public static final String APP_VERSION = "0.0.2";
|
||||
|
||||
/** help contents map */
|
||||
public static final Map<String, String[]> help =
|
||||
new HashMap<String, String[]>();
|
||||
|
||||
public HelpManager() {
|
||||
help.putAll(HelpContents.Load());
|
||||
}
|
||||
|
||||
/** Print out the program version. */
|
||||
public void printVersion() {
|
||||
System.out.println(APP_NAME + ", " + APP_VERSION + " version.\n"
|
||||
+ "Copyright (c) 2007 by udanax, "
|
||||
+ "licensed to Apache Software Foundation.\n"
|
||||
+ "Type 'help;' for usage.\n");
|
||||
}
|
||||
|
||||
public static void printHelp(String cmd) {
|
||||
if (cmd.equals("")) {
|
||||
System.out.println("Type 'help <command>;' to see command-specific "
|
||||
+ "usage.\n");
|
||||
for (Map.Entry<String, String[]> helpMap : help.entrySet()) {
|
||||
wrapping(helpMap.getKey(), helpMap.getValue(), false);
|
||||
}
|
||||
System.out.println();
|
||||
} else {
|
||||
if (help.containsKey(cmd.toUpperCase())) {
|
||||
String[] msg = help.get(cmd.toUpperCase());
|
||||
wrapping(cmd.toUpperCase(), msg, true);
|
||||
} else {
|
||||
System.out.println("Unknown Command : Type 'help;' for usage.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void wrapping(String cmd, String[] cmdType, boolean example) {
|
||||
System.out.printf("%-10s", cmd);
|
||||
if (cmdType[0].length() > 55) {
|
||||
System.out.println(cmdType[0].substring(0, 55));
|
||||
System.out.printf("%13s", "");
|
||||
System.out.println(cmdType[0].substring(55, cmdType[1].length()));
|
||||
} else {
|
||||
System.out.println(cmdType[0]);
|
||||
}
|
||||
|
||||
if (example)
|
||||
System.out.println("\nSyntax:\n" + cmdType[1] + "\n");
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
@ -30,12 +31,15 @@ import org.apache.hadoop.io.Text;
|
|||
* Inserts values into tables.
|
||||
*/
|
||||
public class InsertCommand extends BasicCommand {
|
||||
|
||||
private Text tableName;
|
||||
private List<String> columnfamilies;
|
||||
private List<String> values;
|
||||
private String rowKey;
|
||||
|
||||
public InsertCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
if (this.tableName == null || this.values == null || this.rowKey == null)
|
||||
return new ReturnMsg(0, "Syntax error : Please check 'Insert' syntax.");
|
||||
|
@ -92,4 +96,9 @@ public class InsertCommand extends BasicCommand {
|
|||
public byte[] getValue(int i) {
|
||||
return this.values.get(i).getBytes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.INSERT;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.shell;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
@ -40,9 +41,12 @@ import org.apache.hadoop.util.RunJar;
|
|||
* Run hadoop jar commands.
|
||||
*/
|
||||
public class JarCommand extends BasicCommand {
|
||||
|
||||
private List<String> query;
|
||||
|
||||
public JarCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public ReturnMsg execute(@SuppressWarnings("unused") Configuration conf) {
|
||||
|
||||
|
@ -98,6 +102,7 @@ public class JarCommand extends BasicCommand {
|
|||
try {
|
||||
FileUtil.fullyDelete(workDir);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -122,7 +127,7 @@ public class JarCommand extends BasicCommand {
|
|||
Method main = mainClass.getMethod("main", new Class[] {
|
||||
Array.newInstance(String.class, 0).getClass()
|
||||
});
|
||||
String[] newArgs = (String[])Arrays.asList(args)
|
||||
String[] newArgs = Arrays.asList(args)
|
||||
.subList(firstArg, args.length).toArray(new String[0]);
|
||||
try {
|
||||
main.invoke(null, new Object[] { newArgs });
|
||||
|
@ -144,4 +149,9 @@ public class JarCommand extends BasicCommand {
|
|||
private String[] getQuery() {
|
||||
return query.toArray(new String[] {});
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandType getCommandType() {
|
||||
return CommandType.SHELL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,4 +44,9 @@ public class ReturnMsg {
|
|||
public int getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.msg;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
|
@ -32,7 +33,6 @@ import org.apache.hadoop.io.Text;
|
|||
* Command. Provides utility methods for alteration operations.
|
||||
*/
|
||||
public abstract class SchemaModificationCommand extends BasicCommand {
|
||||
|
||||
private int maxVersions;
|
||||
private int maxLength;
|
||||
private HColumnDescriptor.CompressionType compression;
|
||||
|
@ -43,6 +43,10 @@ public abstract class SchemaModificationCommand extends BasicCommand {
|
|||
private int numHash;
|
||||
private int numEntries;
|
||||
|
||||
public SchemaModificationCommand(Writer o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
private void initOptions() {
|
||||
maxVersions = HColumnDescriptor.DEFAULT_N_VERSIONS;
|
||||
maxLength = HColumnDescriptor.DEFAULT_MAX_VALUE_LENGTH;
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
@ -34,7 +36,6 @@ import org.apache.hadoop.hbase.HScannerInterface;
|
|||
import org.apache.hadoop.hbase.HStoreKey;
|
||||
import org.apache.hadoop.hbase.HTable;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.shell.generated.ParseException;
|
||||
import org.apache.hadoop.hbase.shell.generated.Parser;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
import org.apache.hadoop.io.Text;
|
||||
|
@ -60,8 +61,22 @@ public class SelectCommand extends BasicCommand {
|
|||
new String [] {"Column", "Cell"};
|
||||
private static final String [] HEADER =
|
||||
new String [] {"Row", "Column", "Cell"};
|
||||
private static final String STAR = "*";
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
private final TableFormatter formatter;
|
||||
|
||||
// Not instantiable
|
||||
@SuppressWarnings("unused")
|
||||
private SelectCommand() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public SelectCommand(final Writer o, final TableFormatter f) {
|
||||
super(o);
|
||||
this.formatter = f;
|
||||
}
|
||||
|
||||
public ReturnMsg execute(final Configuration conf) {
|
||||
if (this.tableName.equals("") || this.rowKey == null ||
|
||||
this.columns.size() == 0) {
|
||||
return new ReturnMsg(0, "Syntax error : Please check 'Select' syntax.");
|
||||
|
@ -84,7 +99,6 @@ public class SelectCommand extends BasicCommand {
|
|||
|
||||
private int compoundWherePrint(HTable table, HBaseAdmin admin) {
|
||||
int count = 0;
|
||||
TableFormatter formatter = TableFormatterFactory.get();
|
||||
try {
|
||||
if (this.version != 0) {
|
||||
// A number of versions has been specified.
|
||||
|
@ -113,7 +127,8 @@ public class SelectCommand extends BasicCommand {
|
|||
formatter.header(isMultiple()? HEADER_COLUMN_CELL: null);
|
||||
for (Map.Entry<Text, byte[]> e: table.getRow(this.rowKey).entrySet()) {
|
||||
Text key = e.getKey();
|
||||
if (!this.columns.contains(key.toString())) {
|
||||
String keyStr = key.toString();
|
||||
if (!this.columns.contains(STAR) && !this.columns.contains(keyStr)) {
|
||||
continue;
|
||||
}
|
||||
String cellData = toString(key, e.getValue());
|
||||
|
@ -173,7 +188,8 @@ public class SelectCommand extends BasicCommand {
|
|||
}
|
||||
}
|
||||
|
||||
private int scanPrint(HTable table, HBaseAdmin admin) {
|
||||
private int scanPrint(HTable table,
|
||||
HBaseAdmin admin) {
|
||||
int count = 0;
|
||||
HScannerInterface scan = null;
|
||||
try {
|
||||
|
@ -186,7 +202,6 @@ public class SelectCommand extends BasicCommand {
|
|||
}
|
||||
HStoreKey key = new HStoreKey();
|
||||
TreeMap<Text, byte[]> results = new TreeMap<Text, byte[]>();
|
||||
TableFormatter formatter = TableFormatterFactory.get();
|
||||
// If only one column in query, then don't print out the column.
|
||||
formatter.header((parsedColumns.isMultiple())? HEADER: HEADER_ROW_CELL);
|
||||
while (scan.next(key, results) && checkLimit(count)) {
|
||||
|
@ -265,7 +280,7 @@ public class SelectCommand extends BasicCommand {
|
|||
* @return True if query contains multiple columns.
|
||||
*/
|
||||
private boolean isMultiple() {
|
||||
return this.columns.size() > 1 || this.columns.contains("*");
|
||||
return this.columns.size() > 1 || this.columns.contains(STAR);
|
||||
}
|
||||
|
||||
private boolean checkLimit(int count) {
|
||||
|
@ -307,10 +322,17 @@ public class SelectCommand extends BasicCommand {
|
|||
this.version = version;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws ParseException {
|
||||
public static void main(String[] args) throws Exception {
|
||||
Writer out = new OutputStreamWriter(System.out, "UTF-8");
|
||||
HBaseConfiguration c = new HBaseConfiguration();
|
||||
// For debugging
|
||||
Parser parser = new Parser("select * from -ROOT-;");
|
||||
TableFormatterFactory tff =
|
||||
new TableFormatterFactory(out, c);
|
||||
Parser parser = new Parser("select * from 'x' where row='x';", out, tff.get());
|
||||
Command cmd = parser.terminatedCommand();
|
||||
ReturnMsg rm = cmd.execute(new HBaseConfiguration());
|
||||
|
||||
ReturnMsg rm = cmd.execute(c);
|
||||
out.write(rm == null? "": rm.toString());
|
||||
out.flush();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.HBaseAdmin;
|
||||
|
@ -29,10 +30,28 @@ import org.apache.hadoop.hbase.HTableDescriptor;
|
|||
* Shows all available tables.
|
||||
*/
|
||||
public class ShowCommand extends BasicCommand {
|
||||
private static final String [] HEADER = new String [] {"Table Name"};
|
||||
private static final String [] HEADER = new String [] {"Name", "Descriptor"};
|
||||
private String command;
|
||||
private final TableFormatter formatter;
|
||||
|
||||
public ReturnMsg execute(Configuration conf) {
|
||||
// Not instantiable
|
||||
@SuppressWarnings("unused")
|
||||
private ShowCommand() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public ShowCommand(final Writer o, final TableFormatter f) {
|
||||
this(o, f, null);
|
||||
}
|
||||
|
||||
public ShowCommand(final Writer o, final TableFormatter f,
|
||||
final String argument) {
|
||||
super(o);
|
||||
this.formatter = f;
|
||||
this.command = argument;
|
||||
}
|
||||
|
||||
public ReturnMsg execute(final Configuration conf) {
|
||||
if (this.command == null) {
|
||||
return new ReturnMsg(0, "Syntax error : Please check 'Show' syntax");
|
||||
}
|
||||
|
@ -43,13 +62,12 @@ public class ShowCommand extends BasicCommand {
|
|||
HTableDescriptor[] tables = admin.listTables();
|
||||
tableLength = tables.length;
|
||||
if (tableLength == 0) {
|
||||
return new ReturnMsg(0, "Table not found");
|
||||
return new ReturnMsg(0, "No tables found");
|
||||
}
|
||||
TableFormatter formatter = TableFormatterFactory.get();
|
||||
formatter.header(HEADER);
|
||||
for (int i = 0; i < tableLength; i++) {
|
||||
String tableName = tables[i].getName().toString();
|
||||
formatter.row(new String [] {tableName});
|
||||
formatter.row(new String [] {tableName, tables[i].toString()});
|
||||
}
|
||||
formatter.footer();
|
||||
return new ReturnMsg(1, tableLength + " table(s) in set");
|
||||
|
|
|
@ -19,24 +19,41 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.hbase.shell.formatter.AsciiTableFormatter;
|
||||
|
||||
/**
|
||||
* Interface implemented by table formatters outputting select results.
|
||||
* Implementations must have a constructor that takes a Writer.
|
||||
* @see AsciiTableFormatter
|
||||
*/
|
||||
public interface TableFormatter {
|
||||
/**
|
||||
* Output header.
|
||||
* @param titles Titles to emit.
|
||||
* @throws IOException
|
||||
*/
|
||||
public void header(final String [] titles);
|
||||
public void header(final String [] titles) throws IOException;
|
||||
|
||||
/**
|
||||
* Output footer.
|
||||
* @throws IOException
|
||||
*/
|
||||
public void footer();
|
||||
public void footer() throws IOException;
|
||||
|
||||
/**
|
||||
* Output a row.
|
||||
* @param cells
|
||||
* @throws IOException
|
||||
*/
|
||||
public void row(final String [] cells);
|
||||
public void row(final String [] cells) throws IOException;
|
||||
|
||||
/**
|
||||
* @return Output stream being used (This is in interface to enforce fact
|
||||
* that formatters use Writers -- that they operate on character streams
|
||||
* rather than on byte streams).
|
||||
*/
|
||||
public Writer getOut();
|
||||
}
|
|
@ -19,153 +19,65 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.shell;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.io.Writer;
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.shell.formatter.AsciiTableFormatter;
|
||||
|
||||
/**
|
||||
* Table formatter.
|
||||
* TODO: Make a factory that chooses the formatter to use based off
|
||||
* configuration. Read a property from hbase-site or from System properties.
|
||||
* For now, default is the internal AsciiTableFormatter.
|
||||
* TODO: Mysql has --skip-column-names and --silent which inserts a tab as
|
||||
* Specify formatter by setting "hbaseshell.formatter" property in
|
||||
* <code>hbase-site.xml</code> or by setting system property
|
||||
* <code>hbaseshell.formatter</code>. System property setting prevails over all
|
||||
* other configurations. Outputs UTF-8 encoded Strings even if
|
||||
* original data is binary. On static initialization, changes System.out to be
|
||||
* a UTF-8 output stream.
|
||||
* .
|
||||
* <p>TODO: Mysql has --skip-column-names and --silent which inserts a tab as
|
||||
* separator. Also has --html and --xml.
|
||||
* <p>To use the html formatter, currently set HBASE_OPTS as in:
|
||||
* <code>$ HBASE_OPTS="-Dhbaseshell.formatter=org.apache.hadoop.hbase.shell.formatter.HtmlTableFormatter" ./bin/hbase shell</code>
|
||||
* </p>
|
||||
*/
|
||||
public class TableFormatterFactory {
|
||||
private static final TableFormatterFactory factory =
|
||||
new TableFormatterFactory();
|
||||
private static final Log LOG =
|
||||
LogFactory.getLog(TableFormatterFactory.class.getName());
|
||||
private static final String FORMATTER_KEY = "hbaseshell.formatter";
|
||||
private final TableFormatter formatter;
|
||||
|
||||
/**
|
||||
* Not instantiable
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "unused" })
|
||||
private TableFormatterFactory() {
|
||||
this.formatter = new AsciiTableFormatter();
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Configured table formatter.
|
||||
*/
|
||||
public static TableFormatter get() {
|
||||
return factory.formatter;
|
||||
@SuppressWarnings("unchecked")
|
||||
public TableFormatterFactory(final Writer out, final Configuration c) {
|
||||
String className = System.getProperty(FORMATTER_KEY);
|
||||
if (className == null) {
|
||||
className = c.get(FORMATTER_KEY, AsciiTableFormatter.class.getName());
|
||||
}
|
||||
|
||||
/*
|
||||
* Formmatter that outputs data in UTF-8 inside an ASCII table on STDOUT.
|
||||
* If only a single cell result, then no formatting is done. Presumption is
|
||||
* that client manages serial access outputting tables.
|
||||
*/
|
||||
private class AsciiTableFormatter implements TableFormatter {
|
||||
private PrintStream out;
|
||||
private static final String COLUMN_DELIMITER = "| ";
|
||||
private static final String COLUMN_CLOSER = "|";
|
||||
private static final int DEFAULT_COLUMN_WIDTH = 26;
|
||||
// Width is a line of content + delimiter
|
||||
private int columnWidth = DEFAULT_COLUMN_WIDTH;
|
||||
// Amount of width to use for a line of content.
|
||||
private int columnContentWidth =
|
||||
DEFAULT_COLUMN_WIDTH - COLUMN_DELIMITER.length();
|
||||
// COLUMN_LINE is put at head and foot of a column and per column, is drawn
|
||||
// as row delimiter
|
||||
private String columnHorizLine;
|
||||
private final String COLUMN_HORIZ_LINE_CLOSER = "+";
|
||||
// Used padding content to fill column
|
||||
private final String PADDING_CHAR = " ";
|
||||
// True if we are to output no formatting.
|
||||
private boolean noFormatting = false;
|
||||
|
||||
/*
|
||||
* Constructor.
|
||||
*/
|
||||
protected AsciiTableFormatter() {
|
||||
LOG.debug("Table formatter class: " + className);
|
||||
try {
|
||||
this.out = new PrintStream(System.out, true, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException("Failed setting output to UTF-8", e);
|
||||
Class<TableFormatter> clazz =
|
||||
(Class<TableFormatter>) Class.forName(className);
|
||||
Constructor<?> constructor = clazz.getConstructor(Writer.class);
|
||||
this.formatter = (TableFormatter)constructor.newInstance(out);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed instantiation of " + className, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param titles List of titles. Pass null if no formatting (i.e.
|
||||
* no header, no footer, etc.
|
||||
* @return The table formatter instance
|
||||
*/
|
||||
public void header(String[] titles) {
|
||||
if (titles == null) {
|
||||
// print nothing.
|
||||
this.noFormatting = true;
|
||||
return;
|
||||
}
|
||||
// Calculate width of columns.
|
||||
this.columnWidth = titles.length == 1? 3 * DEFAULT_COLUMN_WIDTH:
|
||||
titles.length == 2? 39: DEFAULT_COLUMN_WIDTH;
|
||||
this.columnContentWidth = this.columnWidth - COLUMN_DELIMITER.length();
|
||||
// Create the horizontal line to draw across the top of each column.
|
||||
this.columnHorizLine = calculateColumnHorizLine(this.columnWidth);
|
||||
// Print out a column topper per column.
|
||||
printRowDelimiter(titles.length);
|
||||
row(titles);
|
||||
}
|
||||
|
||||
public void row(String [] cells) {
|
||||
if (this.noFormatting) {
|
||||
this.out.print(cells[0]);
|
||||
return;
|
||||
}
|
||||
// Ok. Output cells a line at a time w/ delimiters between cells.
|
||||
int [] indexes = new int[cells.length];
|
||||
for (int i = 0; i < indexes.length; i++) {
|
||||
indexes[i] = 0;
|
||||
}
|
||||
int allFinished = 0;
|
||||
while (allFinished < indexes.length) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for (int i = 0; i < cells.length; i++) {
|
||||
sb.append(COLUMN_DELIMITER);
|
||||
int offset = indexes[i];
|
||||
if (offset + this.columnContentWidth >= cells[i].length()) {
|
||||
String substr = cells[i].substring(offset);
|
||||
if (substr.length() > 0) {
|
||||
// This column is finished
|
||||
allFinished++;
|
||||
sb.append(substr);
|
||||
}
|
||||
for (int j = 0; j < this.columnContentWidth - substr.length(); j++) {
|
||||
sb.append(PADDING_CHAR);
|
||||
}
|
||||
indexes[i] = cells[i].length();
|
||||
} else {
|
||||
String substr = cells[i].substring(indexes[i],
|
||||
indexes[i] + this.columnContentWidth);
|
||||
indexes[i] += this.columnContentWidth;
|
||||
sb.append(substr);
|
||||
}
|
||||
}
|
||||
sb.append(COLUMN_CLOSER);
|
||||
this.out.println(sb.toString());
|
||||
}
|
||||
printRowDelimiter(cells.length);
|
||||
}
|
||||
|
||||
public void footer() {
|
||||
if (this.noFormatting) {
|
||||
// If no formatting, output a newline to delimit cell and the
|
||||
// result summary output at end of every command.
|
||||
this.out.println();
|
||||
}
|
||||
// We're done. Clear flag.
|
||||
this.noFormatting = false;
|
||||
}
|
||||
|
||||
private void printRowDelimiter(final int columnCount) {
|
||||
for (int i = 0; i < columnCount; i++) {
|
||||
this.out.print(this.columnHorizLine);
|
||||
}
|
||||
this.out.println(COLUMN_HORIZ_LINE_CLOSER);
|
||||
}
|
||||
|
||||
private String calculateColumnHorizLine(final int width) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("+");
|
||||
for (int i = 1; i < width; i++) {
|
||||
sb.append("-");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
public TableFormatter get() {
|
||||
return this.formatter;
|
||||
}
|
||||
}
|
|
@ -27,6 +27,7 @@ import java.util.Map;
|
|||
import java.util.HashMap;
|
||||
import java.io.StringReader;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.hadoop.hbase.shell.*;
|
||||
|
||||
|
@ -35,10 +36,14 @@ import org.apache.hadoop.hbase.shell.*;
|
|||
*/
|
||||
public class Parser implements ParserConstants {
|
||||
private String QueryString;
|
||||
private TableFormatter formatter;
|
||||
private Writer out;
|
||||
|
||||
public Parser(String query) {
|
||||
public Parser(final String query, final Writer o, final TableFormatter f) {
|
||||
this((Reader)(new StringReader(query)));
|
||||
this.QueryString = query;
|
||||
this.formatter = f;
|
||||
this.out = o;
|
||||
}
|
||||
|
||||
public String getQueryStr() {
|
||||
|
@ -164,7 +169,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public ExitCommand exitCommand() throws ParseException {
|
||||
ExitCommand exit = new ExitCommand();
|
||||
ExitCommand exit = new ExitCommand(this.out);
|
||||
jj_consume_token(EXIT);
|
||||
{if (true) return exit;}
|
||||
throw new Error("Missing return statement in function");
|
||||
|
@ -172,7 +177,7 @@ public class Parser implements ParserConstants {
|
|||
|
||||
final public FsCommand fsCommand() throws ParseException {
|
||||
Token t = null;
|
||||
FsCommand fs = new FsCommand();
|
||||
FsCommand fs = new FsCommand(this.out);
|
||||
List<String> query = new ArrayList<String>();
|
||||
jj_consume_token(FS);
|
||||
label_1:
|
||||
|
@ -195,7 +200,7 @@ public class Parser implements ParserConstants {
|
|||
|
||||
final public JarCommand jarCommand() throws ParseException {
|
||||
Token t = null;
|
||||
JarCommand jar = new JarCommand();
|
||||
JarCommand jar = new JarCommand(this.out);
|
||||
List<String> query = new ArrayList<String>();
|
||||
jj_consume_token(JAR);
|
||||
label_2:
|
||||
|
@ -230,7 +235,7 @@ public class Parser implements ParserConstants {
|
|||
|
||||
final public HelpCommand helpCommand() throws ParseException {
|
||||
Token t = null;
|
||||
HelpCommand help = new HelpCommand();
|
||||
HelpCommand help = new HelpCommand(this.out, this.formatter);
|
||||
String argument = "";
|
||||
jj_consume_token(HELP);
|
||||
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
|
||||
|
@ -304,7 +309,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public ShowCommand showCommand() throws ParseException {
|
||||
ShowCommand show = new ShowCommand();
|
||||
ShowCommand show = new ShowCommand(this.out, this.formatter);
|
||||
String argument = null;
|
||||
jj_consume_token(SHOW);
|
||||
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
|
||||
|
@ -323,7 +328,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public DescCommand descCommand() throws ParseException {
|
||||
DescCommand desc = new DescCommand();
|
||||
DescCommand desc = new DescCommand(this.out, this.formatter);
|
||||
String argument = null;
|
||||
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
|
||||
case DESCRIBE:
|
||||
|
@ -450,7 +455,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public CreateCommand createCommand() throws ParseException {
|
||||
CreateCommand createCommand = new CreateCommand();
|
||||
CreateCommand createCommand = new CreateCommand(this.out);
|
||||
String table = null;
|
||||
Map<String, Object> columnSpec = null;
|
||||
String column = null;
|
||||
|
@ -483,7 +488,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public AlterCommand alterCommand() throws ParseException {
|
||||
AlterCommand alterCommand = new AlterCommand();
|
||||
AlterCommand alterCommand = new AlterCommand(this.out);
|
||||
String table = null;
|
||||
String column = null;
|
||||
Map<String, Object> columnSpec = null;
|
||||
|
@ -547,7 +552,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public DropCommand dropCommand() throws ParseException {
|
||||
DropCommand drop = new DropCommand();
|
||||
DropCommand drop = new DropCommand(this.out);
|
||||
List<String> tableList = null;
|
||||
jj_consume_token(DROP);
|
||||
jj_consume_token(TABLE);
|
||||
|
@ -558,7 +563,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public InsertCommand insertCommand() throws ParseException {
|
||||
InsertCommand in = new InsertCommand();
|
||||
InsertCommand in = new InsertCommand(this.out);
|
||||
List<String> columnfamilies = null;
|
||||
List<String> values = null;
|
||||
String table = null;
|
||||
|
@ -593,7 +598,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public DeleteCommand deleteCommand() throws ParseException {
|
||||
DeleteCommand deleteCommand = new DeleteCommand();
|
||||
DeleteCommand deleteCommand = new DeleteCommand(this.out);
|
||||
List<String> columnList = null;
|
||||
Token t = null;
|
||||
String table = null;
|
||||
|
@ -624,7 +629,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public SelectCommand selectCommand() throws ParseException {
|
||||
SelectCommand select = new SelectCommand();
|
||||
SelectCommand select = new SelectCommand(this.out, this.formatter);
|
||||
List<String> columns = null;
|
||||
String rowKey = "";
|
||||
String timestamp = null;
|
||||
|
@ -704,7 +709,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public EnableCommand enableCommand() throws ParseException {
|
||||
EnableCommand enableCommand = new EnableCommand();
|
||||
EnableCommand enableCommand = new EnableCommand(this.out);
|
||||
String table = null;
|
||||
jj_consume_token(ENABLE);
|
||||
table = Identifier();
|
||||
|
@ -714,7 +719,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public DisableCommand disableCommand() throws ParseException {
|
||||
DisableCommand disableCommand = new DisableCommand();
|
||||
DisableCommand disableCommand = new DisableCommand(this.out);
|
||||
String table = null;
|
||||
jj_consume_token(DISABLE);
|
||||
table = Identifier();
|
||||
|
@ -724,7 +729,7 @@ public class Parser implements ParserConstants {
|
|||
}
|
||||
|
||||
final public ClearCommand clearCommand() throws ParseException {
|
||||
ClearCommand clear = new ClearCommand();
|
||||
ClearCommand clear = new ClearCommand(this.out);
|
||||
jj_consume_token(CLEAR);
|
||||
{if (true) return clear;}
|
||||
throw new Error("Missing return statement in function");
|
||||
|
@ -970,6 +975,16 @@ public class Parser implements ParserConstants {
|
|||
finally { jj_save(0, xla); }
|
||||
}
|
||||
|
||||
final private boolean jj_3R_12() {
|
||||
Token xsp;
|
||||
xsp = jj_scanpos;
|
||||
if (jj_scan_token(60)) {
|
||||
jj_scanpos = xsp;
|
||||
if (jj_scan_token(61)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
final private boolean jj_3R_11() {
|
||||
if (jj_scan_token(ID)) return true;
|
||||
return false;
|
||||
|
@ -991,16 +1006,6 @@ public class Parser implements ParserConstants {
|
|||
return false;
|
||||
}
|
||||
|
||||
final private boolean jj_3R_12() {
|
||||
Token xsp;
|
||||
xsp = jj_scanpos;
|
||||
if (jj_scan_token(60)) {
|
||||
jj_scanpos = xsp;
|
||||
if (jj_scan_token(61)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public ParserTokenManager token_source;
|
||||
SimpleCharStream jj_input_stream;
|
||||
public Token token, jj_nt;
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Map;
|
|||
import java.util.HashMap;
|
||||
import java.io.StringReader;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import org.apache.hadoop.hbase.shell.*;
|
||||
|
||||
public class ParserTokenManager implements ParserConstants
|
||||
|
|
|
@ -67,6 +67,20 @@
|
|||
sooner. The default is 30 seconds.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.master.info.port</name>
|
||||
<value>-1</value>
|
||||
<description>The port for the hbase master web UI
|
||||
Set to -1 if you do not want the info server to run.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.regionserver.info.port</name>
|
||||
<value>-1</value>
|
||||
<description>The port for the hbase regionserver web UI
|
||||
Set to -1 if you do not want the info server to run.
|
||||
</description>
|
||||
</property>
|
||||
<property>
|
||||
<name>hbase.master.lease.thread.wakefrequency</name>
|
||||
<value>3000</value>
|
||||
|
|
|
@ -71,7 +71,7 @@ public abstract class HBaseClusterTestCase extends HBaseTestCase {
|
|||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
this.cluster =
|
||||
new MiniHBaseCluster(this.conf, this.regionServers, this.miniHdfs);
|
||||
|
@ -79,7 +79,7 @@ public abstract class HBaseClusterTestCase extends HBaseTestCase {
|
|||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void tearDown() throws Exception {
|
||||
protected void tearDown() throws Exception {
|
||||
super.tearDown();
|
||||
if (this.cluster != null) {
|
||||
this.cluster.shutdown();
|
||||
|
|
|
@ -66,7 +66,7 @@ public abstract class HBaseTestCase extends TestCase {
|
|||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
this.testDir = getUnitTestdir(getName());
|
||||
this.localFs = FileSystem.getLocal(this.conf);
|
||||
|
@ -77,7 +77,7 @@ public abstract class HBaseTestCase extends TestCase {
|
|||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void tearDown() throws Exception {
|
||||
protected void tearDown() throws Exception {
|
||||
if (this.localFs != null && this.testDir != null &&
|
||||
this.localFs.exists(testDir)) {
|
||||
this.localFs.delete(testDir);
|
||||
|
|
|
@ -84,7 +84,6 @@ public class MiniHBaseCluster implements HConstants {
|
|||
|
||||
/**
|
||||
* Starts a MiniHBaseCluster on top of an existing HDFSCluster
|
||||
*
|
||||
*<pre>
|
||||
****************************************************************************
|
||||
* * * * * * N O T E * * * * *
|
||||
|
@ -181,7 +180,6 @@ public class MiniHBaseCluster implements HConstants {
|
|||
this.regionServer = r;
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void run() {
|
||||
LOG.info("Starting " + getName());
|
||||
|
@ -461,4 +459,8 @@ public class MiniHBaseCluster implements HConstants {
|
|||
r.flushcache(false);
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<RegionServerThread> getRegionThreads() {
|
||||
return this.regionThreads;
|
||||
}
|
||||
}
|
|
@ -34,7 +34,7 @@ public class TestToString extends TestCase {
|
|||
final String hostport = "127.0.0.1:9999";
|
||||
HServerAddress address = new HServerAddress(hostport);
|
||||
assertEquals("HServerAddress toString", address.toString(), hostport);
|
||||
HServerInfo info = new HServerInfo(address, -1);
|
||||
HServerInfo info = new HServerInfo(address, -1, 60030);
|
||||
assertEquals("HServerInfo", "address: " + hostport + ", startcode: -1" +
|
||||
", load: (requests: 0 regions: 0)", info.toString());
|
||||
}
|
||||
|
|
|
@ -21,8 +21,10 @@ package org.apache.hadoop.hbase.shell;
|
|||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
@ -157,7 +159,9 @@ public class TestHBaseShell extends HBaseClusterTestCase {
|
|||
private ReturnMsg runCommand(final String cmdStr)
|
||||
throws ParseException, UnsupportedEncodingException {
|
||||
LOG.info("Running command: " + cmdStr);
|
||||
Parser parser = new Parser(cmdStr);
|
||||
Writer out = new OutputStreamWriter(System.out, "UTF-8");
|
||||
TableFormatterFactory tff = new TableFormatterFactory(out, this.conf);
|
||||
Parser parser = new Parser(cmdStr, out, tff.get());
|
||||
Command cmd = parser.terminatedCommand();
|
||||
ReturnMsg rm = cmd.execute(this.conf);
|
||||
dumpStdout();
|
||||
|
|
Loading…
Reference in New Issue