我是靠谱客的博主 怕孤独橘子,这篇文章主要介绍关于HFile的思考,现在分享给大家,希望可以做个参考。

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

关于HFile文件的详细介绍,可以查看这篇文章:http://www.data-works.org/download/hfile.pdf

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

  1. HFile的作用。
  2. HFile的格式。
  3. HFile的性能。
  4. HFile的使用注意事项。
  5. HFile的编程接口。

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

于是有如下的测试代码:

复制代码
1
2
3
1: // create local file system
复制代码
1
2
3
2: FileSystem fs = new RawLocalFileSystem();
复制代码
1
2
3
3: fs.setConf(new Configuration());
复制代码
1
2
3
4:
复制代码
1
2
3
5: // block size = 1kb
复制代码
1
2
3
6: HFile.Writer hwriter = new HFile.Writer(fs,
复制代码
1
2
3
4
7: new Path("hfile"), 1, (Compression.Algorithm) null, null);
复制代码
1
2
3
8:
复制代码
1
2
3
9: // create key & value, the value is 8kb, larger than 1kb
复制代码
1
2
3
10: byte[] key = "www.data-works.org".getBytes();
复制代码
1
2
3
11: byte[] value = new byte[8 * 1024];
复制代码
1
2
3
12: for (int i = 0; i < 8 * 1024; i++) {
复制代码
1
2
3
4
13: value[i] = '0';
复制代码
1
2
3
14: }
复制代码
1
2
3
15:
复制代码
1
2
3
16: // add values to hfile
复制代码
1
2
3
17: for (int i = 0; i < 10; i++) {
复制代码
1
2
3
4
18: hwriter.append(key, value);
复制代码
1
2
3
19: }
复制代码
1
2
3
20:
复制代码
1
2
3
21: // close hfile
复制代码
1
2
3
22: hwriter.close();

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

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

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

这个hfile的读取代码如下:

复制代码
1
2
3
1: // create local file system
复制代码
1
2
3
2: FileSystem fs = new RawLocalFileSystem();
复制代码
1
2
3
3: fs.initialize(URI.create("file:///"), new Configuration());
复制代码
1
2
3
4: fs.setConf(new Configuration());
复制代码
1
2
3
5: HFile.Reader hreader = new HFile.Reader(fs,
复制代码
1
2
3
4
6: new Path("hfile"), null, false);
复制代码
1
2
3
7:
复制代码
1
2
3
8: // loadFileInfo
复制代码
1
2
3
9: hreader.loadFileInfo();
复制代码
1
2
3
10:
复制代码
1
2
3
11: HFileScanner hscanner = hreader.getScanner(false, false);
复制代码
1
2
3
12:
复制代码
1
2
3
13: // seek to the start position of the hfile.
复制代码
1
2
3
14: hscanner.seekTo();
复制代码
1
2
3
15:
复制代码
1
2
3
16: // print values.
复制代码
1
2
3
17: int index = 1;
复制代码
1
2
3
18: while (hscanner.next()) {
复制代码
1
2
3
4
19: System.out.println("index: " + index++);
复制代码
1
2
3
4
20: System.out.println("key: " + hscanner.getKeyString());
复制代码
1
2
3
4
21: System.out.println("value: " + hscanner.getValueString());
复制代码
1
2
3
22: }
复制代码
1
2
3
23:
复制代码
1
2
3
24: // close hfile.
复制代码
1
2
3
25: hreader.close();

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

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

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

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

  1. 暂用过多内存
  2. 启动加载时间缓慢

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

更多关于HBase方面的文章,请参考:http://blog.data-works.org

最后

以上就是怕孤独橘子最近收集整理的关于关于HFile的思考的全部内容,更多相关关于HFile内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部