You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2009/07/16 01:18:22 UTC
svn commit: r794454 - in /hadoop/hbase/branches/0.19: CHANGES.txt
src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
src/java/org/apache/hadoop/hbase/util/FSUtils.java
Author: stack
Date: Wed Jul 15 23:18:22 2009
New Revision: 794454
URL: http://svn.apache.org/viewvc?rev=794454&view=rev
Log:
HBASE-1662 Tool to run major compaction on catalog regions when hbase is shutdown
Modified:
hadoop/hbase/branches/0.19/CHANGES.txt
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/util/FSUtils.java
Modified: hadoop/hbase/branches/0.19/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/CHANGES.txt?rev=794454&r1=794453&r2=794454&view=diff
==============================================================================
--- hadoop/hbase/branches/0.19/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.19/CHANGES.txt Wed Jul 15 23:18:22 2009
@@ -20,6 +20,8 @@
HBASE-1618 Investigate further into the MemStoreFlusher StoreFile limit
(Jon Gray via Stack)
HBASE-698 HLog recovery is not performed after master failure
+ HBASE-1662 Tool to run major compaction on catalog regions when hbase
+ is shutdown
Release 0.19.3 - May 27th, 2009
BUG FIXES
Modified: hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=794454&r1=794453&r2=794454&view=diff
==============================================================================
--- hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java Wed Jul 15 23:18:22 2009
@@ -2680,4 +2680,107 @@
releaseRowLock(lid);
}
}
+
+ /*
+ * This method calls System.exit.
+ * @param message Message to print out. May be null.
+ */
+ private static void printUsageAndExit(final String message) {
+ if (message != null && message.length() > 0) System.out.println(message);
+ System.out.println("Usage: HRegion CATLALOG_TABLE_DIR [major_compact]");
+ System.out.println("Options:");
+ System.out.println(" major_compact Pass this option to major compact " +
+ "passed region.");
+ System.out.println("Default outputs scan of passed region.");
+ System.exit(1);
+ }
+
+ /*
+ * Process table.
+ * Do major compaction or list content.
+ * @param fs
+ * @param p
+ * @param log
+ * @param c
+ * @param majorCompact
+ * @throws IOException
+ */
+ private static void processTable(final FileSystem fs, final Path p,
+ final HLog log, final HBaseConfiguration c,
+ final boolean majorCompact)
+ throws IOException {
+ HRegion region = null;
+ String rootStr = Bytes.toString(HConstants.ROOT_TABLE_NAME);
+ String metaStr = Bytes.toString(HConstants.META_TABLE_NAME);
+ // Currently expects tables have one region only.
+ if (p.getName().startsWith(rootStr)) {
+ region = new HRegion(p, log, fs, c, HRegionInfo.ROOT_REGIONINFO, null);
+ } else if (p.getName().startsWith(metaStr)) {
+ region = new HRegion(p, log, fs, c, HRegionInfo.FIRST_META_REGIONINFO,
+ null);
+ } else {
+ throw new IOException("Not a known catalog table: " + p.toString());
+ }
+ try {
+ region.initialize(null, null);
+ if (majorCompact) {
+ region.compactStores(true);
+ } else {
+ // Default behavior
+ InternalScanner scanner = region.getScanner(
+ new byte [][] {HConstants.COLUMN_FAMILY, HConstants.COLUMN_FAMILY_HISTORIAN},
+ HConstants.EMPTY_START_ROW, HConstants.LATEST_TIMESTAMP, null);
+ try {
+ boolean done = false;
+ do {
+ HStoreKey key = new HStoreKey();
+ SortedMap<byte [], Cell> values =
+ new TreeMap<byte [], Cell>(Bytes.BYTES_COMPARATOR);
+ done = scanner.next(key, values);
+ if (values.size() > 0) LOG.info(key + " " + values);
+ } while (done);
+ } finally {
+ scanner.close();
+ }
+ }
+ } finally {
+ region.close();
+ }
+ }
+
+ /**
+ * Facility for dumping and compacting catalog tables.
+ * Only does catalog tables since these are only tables we for sure know
+ * schema on. For usage run:
+ * <pre>
+ * ./bin/hbase org.apache.hadoop.hbase.regionserver.HRegion
+ * </pre>
+ * @param args
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+ if (args.length < 1) {
+ printUsageAndExit(null);
+ }
+ boolean majorCompact = false;
+ if (args.length > 1) {
+ if (!args[1].toLowerCase().startsWith("major")) {
+ printUsageAndExit("ERROR: Unrecognized option <" + args[1] + ">");
+ }
+ majorCompact = true;
+
+ }
+ Path tableDir = new Path(args[0]);
+ HBaseConfiguration c = new HBaseConfiguration();
+ FileSystem fs = FileSystem.get(c);
+ String tmp = c.get("hbase.tmp.dir", "/tmp");
+ Path logdir = new Path(new Path(tmp),
+ "hlog" + tableDir.getName() + System.currentTimeMillis());
+ HLog log = new HLog(fs, logdir, c, null);
+ try {
+ processTable(fs, tableDir, log, c, majorCompact);
+ } finally {
+ log.close();
+ }
+ }
}
Modified: hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/util/FSUtils.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/util/FSUtils.java?rev=794454&r1=794453&r2=794454&view=diff
==============================================================================
--- hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/util/FSUtils.java (original)
+++ hadoop/hbase/branches/0.19/src/java/org/apache/hadoop/hbase/util/FSUtils.java Wed Jul 15 23:18:22 2009
@@ -33,6 +33,7 @@
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HConstants;
@@ -211,4 +212,25 @@
}
return rootdir;
}
+
+ /**
+ * A {@link PathFilter} that returns directories.
+ */
+ public static class DirFilter implements PathFilter {
+ private final FileSystem fs;
+
+ public DirFilter(final FileSystem fs) {
+ this.fs = fs;
+ }
+
+ public boolean accept(Path p) {
+ boolean isdir = false;
+ try {
+ isdir = this.fs.getFileStatus(p).isDir();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return isdir;
+ }
+ }
}
\ No newline at end of file