由于hbase表是稀疏表,因此hbase不仅为每个单元存储值,而且还存储标识单元所需的所有信息(通常称为键,不要与rowkey混淆)。关键点如下:
rowkey columnfamily columnqualifier时间戳
所有这些信息都存储在每个条目中。这就是为什么建议对列族和列限定符使用短名称以减少额外开销的原因。
我的问题是:为什么每次输入都需要存储columnfamily?据我所知,每个存储文件只属于一个列族。对于每个存储文件,只存储一次列族名称是不够的吗?这将减少开销,可以使用任意的列族名称,并且我们仍然能够识别每个条目的列族。我错过了什么?
2条答案
按热度按时间lnlaulya1#
我认为原因可能只是由于简单性和键结构直接Map到rpc表示的事实。要在编写列族之前删除它并在阅读后重新创建它,需要更多的内部复制和翻译。我猜性能权衡比听起来更重要,但我不知道hbase开发人员是否尝试过这种特殊的变化。我知道,如果您关心列族和列的空间,您可以启用数据块编码以最小化开销。您还可以查看kiji项目,该项目为您缩短这些名称,并为您的代码提供翻译层,这意味着您仍然可以使用更长的名称,而不必担心成本。
kiz8lqtg2#
与关系数据库一样,hbase中的表由行和列组成。在hbase中,列按列族分组在一起。这个分组在逻辑上表示为MapMap中的一个图层。柱族也以物理方式表示。每个列族在磁盘上都有自己的一组hfiles。这种物理隔离允许将一个列族的底层hfiles与其他列族隔离管理。就压实而言,每个柱族的HFILES是独立管理的。