关于HFile的思考--创建和解析HFile

转自:http://hbase.info/2011/07/22/think_about_hfile

原文链接:http://blog.data-works.org/2011/07/关于HFile的思考/

原文作者郭鹏,国内Cassandra领域的先驱者和实践者。资深软件开发工程师,擅长分布式应用程序的开发和使用,实践经验极其丰富。新浪微博:@逖靖寒

————————————– 毫无理由的分割线 ———————————

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

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

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

HFile的作用。
HFile的格式。
HFile的性能。
HFile的使用注意事项。
HFile的编程接口。
HFile中有一个很重要的参数,那就是block size。如果我们写入hfile中的某一个value的值大于block size会怎么样?

于是有如下的测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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的读取代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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的两个主要缺陷提出来的:

暂用过多内存
启动加载时间缓慢
有兴趣的朋友可以详细了解一下。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值