HBASE-11847 HFile tool should be able to print block headers

This commit is contained in:
Nick Dimiduk 2014-09-09 14:12:43 -07:00
parent c0d4b26872
commit 013daadd95
1 changed files with 37 additions and 7 deletions

View File

@ -32,6 +32,8 @@ import java.util.SortedMap;
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options; import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser; import org.apache.commons.cli.PosixParser;
@ -51,6 +53,7 @@ import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.KeyValueUtil; import org.apache.hadoop.hbase.KeyValueUtil;
import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.Tag; import org.apache.hadoop.hbase.Tag;
import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;
import org.apache.hadoop.hbase.io.hfile.HFile.FileInfo; import org.apache.hadoop.hbase.io.hfile.HFile.FileInfo;
import org.apache.hadoop.hbase.regionserver.TimeRangeTracker; import org.apache.hadoop.hbase.regionserver.TimeRangeTracker;
import org.apache.hadoop.hbase.util.BloomFilter; import org.apache.hadoop.hbase.util.BloomFilter;
@ -84,7 +87,8 @@ public class HFilePrettyPrinter extends Configured implements Tool {
private boolean printValue; private boolean printValue;
private boolean printKey; private boolean printKey;
private boolean shouldPrintMeta; private boolean shouldPrintMeta;
private boolean printBlocks; private boolean printBlockIndex;
private boolean printBlockHeaders;
private boolean printStats; private boolean printStats;
private boolean checkRow; private boolean checkRow;
private boolean checkFamily; private boolean checkFamily;
@ -117,16 +121,20 @@ public class HFilePrettyPrinter extends Configured implements Tool {
options.addOption("e", "printkey", false, "Print keys"); options.addOption("e", "printkey", false, "Print keys");
options.addOption("m", "printmeta", false, "Print meta data of file"); options.addOption("m", "printmeta", false, "Print meta data of file");
options.addOption("b", "printblocks", false, "Print block index meta data"); options.addOption("b", "printblocks", false, "Print block index meta data");
options.addOption("h", "printblockheaders", false, "Print block headers for each block.");
options.addOption("k", "checkrow", false, options.addOption("k", "checkrow", false,
"Enable row order check; looks for out-of-order keys"); "Enable row order check; looks for out-of-order keys");
options.addOption("a", "checkfamily", false, "Enable family check"); options.addOption("a", "checkfamily", false, "Enable family check");
options.addOption("f", "file", true,
"File to scan. Pass full-path; e.g. hdfs://a:9000/hbase/hbase:meta/12/34");
options.addOption("w", "seekToRow", true, options.addOption("w", "seekToRow", true,
"Seek to this row and print all the kvs for this row only"); "Seek to this row and print all the kvs for this row only");
options.addOption("r", "region", true,
"Region to scan. Pass region name; e.g. 'hbase:meta,,1'");
options.addOption("s", "stats", false, "Print statistics"); options.addOption("s", "stats", false, "Print statistics");
OptionGroup files = new OptionGroup();
files.addOption(new Option("f", "file", true,
"File to scan. Pass full-path; e.g. hdfs://a:9000/hbase/hbase:meta/12/34"));
files.addOption(new Option("r", "region", true,
"Region to scan. Pass region name; e.g. 'hbase:meta,,1'"));
options.addOptionGroup(files);
} }
public boolean parseOptions(String args[]) throws ParseException, public boolean parseOptions(String args[]) throws ParseException,
@ -143,7 +151,8 @@ public class HFilePrettyPrinter extends Configured implements Tool {
printValue = cmd.hasOption("p"); printValue = cmd.hasOption("p");
printKey = cmd.hasOption("e") || printValue; printKey = cmd.hasOption("e") || printValue;
shouldPrintMeta = cmd.hasOption("m"); shouldPrintMeta = cmd.hasOption("m");
printBlocks = cmd.hasOption("b"); printBlockIndex = cmd.hasOption("b");
printBlockHeaders = cmd.hasOption("h");
printStats = cmd.hasOption("s"); printStats = cmd.hasOption("s");
checkRow = cmd.hasOption("k"); checkRow = cmd.hasOption("k");
checkFamily = cmd.hasOption("a"); checkFamily = cmd.hasOption("a");
@ -262,11 +271,32 @@ public class HFilePrettyPrinter extends Configured implements Tool {
printMeta(reader, fileInfo); printMeta(reader, fileInfo);
} }
if (printBlocks) { if (printBlockIndex) {
System.out.println("Block Index:"); System.out.println("Block Index:");
System.out.println(reader.getDataBlockIndexReader()); System.out.println(reader.getDataBlockIndexReader());
} }
if (printBlockHeaders) {
System.out.println("Block Headers:");
/*
* TODO: this same/similar block iteration logic is used in HFileBlock#blockRange and
* TestLazyDataBlockDecompression. Refactor?
*/
FSDataInputStreamWrapper fsdis = new FSDataInputStreamWrapper(fs, file);
long fileSize = fs.getFileStatus(file).getLen();
FixedFileTrailer trailer =
FixedFileTrailer.readFromStream(fsdis.getStream(false), fileSize);
long offset = trailer.getFirstDataBlockOffset(),
max = trailer.getLastDataBlockOffset();
HFileBlock block;
while (offset <= max) {
block = reader.readBlock(offset, -1, /* cacheBlock */ false, /* pread */ false,
/* isCompaction */ false, /* updateCacheMetrics */ false, null, null);
offset += block.getOnDiskSizeWithHeader();
System.out.println(block);
}
}
if (printStats) { if (printStats) {
fileStats.finish(); fileStats.finish();
System.out.println("Stats:\n" + fileStats); System.out.println("Stats:\n" + fileStats);