转自: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

709

被折叠的 条评论
为什么被折叠?



