关于HFile的思考

本文是一篇转载文章,原文作者郭鹏(@逖靖寒),国内Cassandra领域的先驱者和实践者。资深软件开发工程师,擅长分布式应用程序的开发和使用,实践经验极其丰富。在本文中,作者推荐了HFile文件格式的经典论文,并对HFile的block size的应用进行了实例探讨。

0.90.x版本的HBase中的文件是存储在HFile中的。

关于HFile文件的详细介绍,可以查看这篇文章:hfile.pdf

这篇文章中介绍了以下五点内容:

  • HFile的作用。
  • HFile的格式。
  • HFile的性能。
  • HFile的使用注意事项。
  • HFile的编程接口。

HFile中有一个很重要的参数,那就是block size。如果我们写入hfile中的某一个value的值大于block size会怎么样?

于是有如下的测试代码:

// create local file system
FileSystem fs = new RawLocalFileSystem();
fs.setConf(new Configuration());

// block size = 1kb
HFile.Writer hwriter = new HFile.Writer(fs,
        new Path("hfile"), 1, (Compression.Algorithm) null, null);

// create key & value, the value is 8kb, larger than 1kb
byte[] key = "www.data-works.org".getBytes();
byte[] value = new byte[8 * 1024];
for (int i = 0; i < 8 * 1024; i++) {
    value[i] = '0';
}

// add values to hfile
for (int i = 0; i < 10; i++) {
    hwriter.append(key, value);
}

// close hfile
hwriter.close();

上面的代码可以看出来,每一个value的值都是8kb,已经超过了hfile预设的1kb的block size。

实际的写入情况是如果value大于block size,那么就按照实际的情况来写。

上面的测试用例执行完毕以后,整个hile文件只有1个data block。

这个hfile的读取代码如下:

// create local file system
FileSystem fs = new RawLocalFileSystem();
fs.initialize(URI.create("file:///"), new Configuration());
fs.setConf(new Configuration());
HFile.Reader hreader = new HFile.Reader(fs,
new Path("hfile"), null, false);

// loadFileInfo
hreader.loadFileInfo();

HFileScanner hscanner = hreader.getScanner(false, false);

// seek to the start position of the hfile.
hscanner.seekTo();

// print values.
int index = 1;
while (hscanner.next()) {
System.out.println("index: " + index++);
System.out.println("key: " + hscanner.getKeyString());
System.out.println("value: " + hscanner.getValueString());
}

// close hfile.
hreader.close();

上面的代码将读取hfile,并将这个文件中的所有kv打印出来。

通过上面的测试可以看出:如果某一个key有非常非常多的value,那么查找这些value就无法通过索引去快速查找,而是需要通过遍历进行。

另外,JIRA上面的HBASE-3857也提出了一种新的HFile格式,HFile v2

他主要是针对现有HFile的两个主要缺陷提出来的:

  • 暂用过多内存
  • 启动加载时间缓慢

有兴趣的朋友可以详细了解一下。

来源:blog.data-works.org

anyShare分享此文章的同学,将有机会送我iphone5!
          

无觅相关文章插件,快速提升流量

分类 Hadoop&HBase · tag ,