hbase rowkey结构

第一次提问,有个hbase的问题想请教一下大家:hbase cell单元格的KeyValue结构,是不是意味着每一个单元格都要实际存储rowkey?
比如一行数据rowkey=001,有一个列族cf,三个列name,sex,age,那么三个单元格,每个单元格都要保存001这个rowkey吗?这样一行数据就要存储三个rowkey!如果是的话,那么一行数据岂不是很冗余?

因为我从源码看,每一个cell单元都保存了rowkey
已邀请:

openinx - HBase Committer @小米

赞同来自: qgxiaozhan Figo

> hbase cell单元格的KeyValue结构,是不是意味着每一个单元格都要实际存储rowkey?
你说的没错, HBase就是每个KeyValue都要存RowKey + CF + CQ + Timestamp.  如果同一个RowKey下的Column很多, 或者timestamp很多的话, 数据确实会有比较多的冗余. 如果对磁盘成本比较关心的话, 可以采用前缀压缩, 就是连续的相同的前缀, 只需要存储一个偏移以及diff的字节即可,相同字节不需要存. 
 
参考: http://archive.cloudera.com/cd ... .html

hmaster

赞同来自: Figo

是这样的,不但冗余rowkey还有CF,时间戳等信息,如果列值比较短,rowkey等其它信息比较长的话,列数量越多,数据冗余越明显。对于这种对存储比较看重的,可以试着从如下方面解决:
1、编码,如前缀编码或者diff。
2、宽表设计,将多列信息存储为1列或者少量的列,使用特殊符号分隔。

之前做过一个内部 SQL ON HBase 的产品,就是采用了类似方案2的底层存储。
如create table a(id string,a string,b string,c string,d .....)实际上底层存储的是id,a+b+c+d+....单行,但对上层访问是透明的,特别适合这种主键查询。并且存储占用特别明显,对于我们一些常见业务(表时常数百列,但没列不长)可以节约数十倍的存储。

大部分应用,都是一次插入1行全部的列,时间戳等都一样,一直不明白为什么HBase 要这样设计(可能是为了简单吧),或者为什么不提供一种可选的存储格式方案,个人感觉还是值得做的。

PS:虽然HBase 介绍说是列存,但我一直觉得容易误导人,个人更觉得应该叫KV存储。列簇级别物理隔离而已。

 

要回复问题请先登录注册