概述
追踪hfile的读方法:
大家都知道 使用hbase hfile -p hfile文件路径是可以查看hfile中的key value的,我们来看一下hfile的读取用到了那个类。
1. 追踪hbase这个shell,得到:
elif [ "$COMMAND" = "hfile" ] ; then
CLASS='org.apache.hadoop.hbase.io.hfile.HFile'
我们看到 具体执行hfile相关的类是在org.apache.hadoop.hbase.io.hfile.HFile 中
2. 打开org.apache.hadoop.hbase.io.hfile.HFile中的main函数:
public static void main(String[] args) throws IOException {
HFilePrettyPrinter prettyPrinter = new HFilePrettyPrinter();
System.exit(prettyPrinter.run(args));
}
看到具体的执行由HFilePrettyPrinter执行。
打开org.apache.hadoop.hbase.io.hfile.HFilePrettyPrinter
public int run(String[] args) {
conf = HBaseConfiguration.create();
try {
FSUtils.setFsDefault(conf, FSUtils.getRootDir(conf));
if (!parseOptions(args))
return 1;
} catch (IOException ex) {
LOG.error("Error parsing command-line options", ex);
return 1;
} catch (ParseException ex) {
LOG.error("Error parsing command-line options", ex);
return 1;
}
// iterate over all files found
for (Path fileName : files) {
try {
processFile(fileName);
} catch (IOException ex) {
LOG.error("Error reading " + fileName, ex);
}
}
if (verbose || printKey) {
System.out.println("Scanned kv count -> " + count);
}
return 0;
}
继续追踪processFile方法,快看到希望了 。 呵呵
private void processFile(Path file) throws IOException {
if (verbose)
System.out.println("Scanning -> " + file);
FileSystem fs = file.getFileSystem(conf);
if (!fs.exists(file)) {
System.err.println("ERROR, file doesnt exist: " + file);
}
HFile.Reader reader = HFile.createReader(fs, file, new CacheConfig(conf));
Map<byte[], byte[]> fileInfo = reader.loadFileInfo();
KeyValueStatsCollector fileStats = null;
if (verbose || printKey || checkRow || checkFamily || printStats) {
// scan over file and read key/value's and check if requested
HFileScanner scanner = reader.getScanner(false, false, false);
fileStats = new KeyValueStatsCollector();
boolean shouldScanKeysValues = false;
if (this.isSeekToRow) {
// seek to the first kv on this row
shouldScanKeysValues =
(scanner.seekTo(KeyValue.createFirstOnRow(this.row).getKey()) != -1);
} else {
shouldScanKeysValues = scanner.seekTo();
}
if (shouldScanKeysValues)
scanKeysValues(file, fileStats, scanner, row);
}
.......
reader.close();
}
这里打印keyvalue,继续:scanKeysValues方法:
private void scanKeysValues(Path file, KeyValueStatsCollector fileStats,
HFileScanner scanner,
byte[] row) throws IOException {
KeyValue pkv = null;
do {
KeyValue kv = scanner.getKeyValue();
.........
// dump key value
if (printKey) {
System.out.print("K: " + kv);
if (printValue) {
System.out.print(" V: " + Bytes.toStringBinary(kv.getValue()));
}
System.out.println();
}
..............
} while (scanner.next());
}
大家可以看到使用的是 do.....while
所以在基于hfile写mapreduce的时候要主要到不要把第一个keyvalue落下奥! 呵呵
Hfile具体格式参见下面的博客: 以下的介绍是v1版本的,v2版本的再说。
转:点击打开链接 http://blog.sae.sina.com.cn/archives/3727
最后
以上就是彪壮刺猬为你收集整理的HBASE 学习----第一篇--Hfile 解析的全部内容,希望文章能够帮你解决HBASE 学习----第一篇--Hfile 解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复