Hbase的Hfile存储

来源:互联网 发布:禾赛科技 知乎 编辑:程序博客网 时间:2024/05/01 05:13

HFile中的Key-Value结构

HFile中的每个Key-Value对就是一个简单的byte数组。但这个byte数组包含了很多项信息,并含有固定的结构。

HFile中的Key-Value

开始是两个长度固定的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分则相对简单,是纯粹的二进制数据。

-------------------------------

HBASE是按列存储的,所以很多人都认为相同column family(列族) 或者qualifier(小列)的数据存储在一起。

这个理解是正确的吗?
真相是:
如果内存中有不同的KeyValue,这些KeyValue的rowkey不同,CF(列族)不同,Qualifier(小列)不同。
当内存执行flush 的时候(操作方法: flush 'tablename'),
所有的相同列族存储在一起的,并按照如下的顺序排序:
1.rowkey
2.列族(实际上相同,此处可忽略)
3.小列
4.时间戳。

在文件层次上,不同的列族,存储在不同的文件中。但是不同的列族,可能会共享一个region。

/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/a
/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/a/9210131397650425238
/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/b
/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/b/7083844554431109536

如上所示:两个不同的列族,共享了同一个region(3917ebd872c0adcb9d6c5a9cfd30b87f)。

由于不同的列族会共享region,所以有可能出现,一个列族已经有1000万行,而另外一个才100行。当一个要求region分割的时候,会导致100行的列会同样分布到多个region中。所以,一般建议不要设置多个列族。
0 0
原创粉丝点击