HBASE 学习----第一篇--Hfile 解析

追踪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


展开阅读全文

没有更多推荐了,返回首页