HBase HFile与Prefix Compression内部实现全解--KeyValue格式
?
?
1. 引子?
HFile (HBase File)是HBase使用的一种文件存储格式的抽象,
?
目前存在两种版本的HFile: HFile V1和HFile V2
?
HBase 0.92之前的版本仅支持HFile V1,
HBase 0.92/0.94同时支持HFile V1和HFile V2。
?
以下分别是HFile V1/V2的结构图:
?
HFile V1
HFile V2

(注: 这两个图片在hbase 0.94的svn目录: src\site\resources\images)
?
图中的数据块(Data block)正是实际存放应用数据的地方,
每个数据块又由一系列的KeyValue组成,并且这些KeyValue之间是按Key升序排列的,
本文将说明KeyValue到底是什么以及当KeyValue越来越多时出现大量类似的数据有哪些算法能减少重复?
?
首先来看一个例子:
假设需要将用户的基本信息以及正在参与的开源项目的有关信息存入HBase:
?
?
名称 字节数 KeyValue A KeyValue B----------------------------------------keyLength 4 35 35valueLength 4 4 2rowKeyLength 2 7 7rowKey rowKeyLength zhh2009 zhh2009columnFamilyLength 1 12 12columnFamily columnFamilyLength 用户基本信息 用户基本信息columnName columnNameLength 职业 性别timestamp 8 1329663787364 1329663787364type 1 4(Put) 4(Put)value valueLength 码农 男---------------------------------------- 表2.2?
?
(注: 在表2.2中,假设中文占两个字节,?
1329663787364 对应的时间是Sun Feb 19 23:03:07 CST 2012,?
keyLength = 2+7+1+12+4+8+1 = 35)
?
观察表2.2的最后两列,发现两者大多数都是相同的,
如果把每个这样的KeyValue放到内存或者硬盘中,肯定会浪费大量的空间,
为了解决这些问题,从HBase 0.94开始引入了一种称之为前缀压缩(prefix compression)的算法。
?
?
1 楼 moudaen 2012-03-05 感谢楼主无私的风险,这篇文章让我对hbase的存储格式有了一个清晰的认识,再一次感觉楼主!我有一个问题想请教楼主:hbase是列数据库,按列存储的,但我不明白在hbase存储中如何体现是按列的,hbase将记录按行划分为HRegion,而每个列族HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,而HStore其中由两部分组成,一部分是MemStore,一部分是StoreFiles,StoreFile的低层是hfile,那请问下hfile就是一个个的列族吗?