Hbase-之HFile存储结构解析
StoreFile(HFile)是Hbase最终存储数据的介质,这里需要了解几个Hbase相关的名词
- Block
- KeyValue
具体的HFile的结构图示如下:
1 Block
HFile是底层存储Hbase数据的Block-based-index-File,而每个HFile又是由N个Blocks组成的,Block是基于ColumnFamily的,不同的ColumnFamily的数据存储在不同的Store下的不同的Hfile中的不同Block中;
HFile底层的压缩实际上是以Block为单位的,具体Block压缩请见:hbase的文件压缩
2 KeyValue
每个Block又是由一个range范围的KeyValue数据组成,KeyValue对象是数据存储的核心,KeyValue包装了一个字节数组,同时将偏移量offsets和lengths放入传递的数组中,这个数组指定从哪里开始解析数据内容。
KeyValue的包装的字节数组的格式如下:
- keylength
- valuelength
- key(还可以被拆解)
- value
而key又可以拆解成以下部分:
- rowlength
- row (i.e., the rowkey)
- columnfamilylength
- columnfamily
- columnqualifier
- timestamp
- keytype (e.g., Put, Delete, DeleteColumn, DeleteFamily)
KeyValue对象不跨Block存储,假如这里有一个KeyValue的大小的8M,即使Block-Size=64KB,当读取该KeyValue的时候也是以一个连贯的Block进行读取。
3 KeyValue操作解读
看完以上内容,检测当在同一个row插入2个columnqualifier的数据
- Put #1:
rowkey=row1, cf:attr1=value1
- Put #2:
rowkey=row1, cf:attr2=value2
即使这是相同的row,KeyValue实例也是为每个ColumnQualifier单独创建;
Key portion for Put #1:
rowlength -----------→ 4
row -----------------→ row1
columnfamilylength --→ 2
columnfamily --------→ cf
columnqualifier -----→ attr1
timestamp -----------→ server time of Put
keytype -------------→ Put
Key portion for Put #2:
rowlength -----------→ 4
row -----------------→ row1
columnfamilylength --→ 2
columnfamily --------→ cf
columnqualifier -----→ attr2
timestamp -----------→ server time of Put
keytype -------------→ Put
明白这点十分重要:rowkey, ColumnFamily, and column (aka columnqualifier) 被包含在一个KeyValue对象实例中,假如这些描述所占字节越长,那么这个KeyValue越大,磁盘消耗就变大。
更多HFile相关资料(压缩、性能测试报告)请参阅:
1、Hfile是什么
2、HFile详细描述