Hbase列族

Hbase列族,hbase,Hbase,Hbase文档指出,避免创建超过2-3个列族,因为Hbase无法很好地处理超过2-3个列族。原因是压缩和冲洗,因此IO。但是,如果我的所有列都是填充的(对于每一行),那么我认为这一推理没有那么重要,因此,考虑到我对列的访问是完全随机的(我想访问任何列的组合)-我可以有一个列族-一个列配置(有效地尝试使其成为纯列) 有许多博客/维基解释了这一点,但它们似乎都相互矛盾,增加了更多的混乱。我似乎无法理解Hbase更喜欢一个列族这一事实,那么调用列存储又有什么意义呢?目前(尽管这一点预计会改变),一个区

Hbase文档指出,避免创建超过2-3个列族,因为Hbase无法很好地处理超过2-3个列族。原因是压缩和冲洗,因此IO。但是,如果我的所有列都是填充的(对于每一行),那么我认为这一推理没有那么重要,因此,考虑到我对列的访问是完全随机的(我想访问任何列的组合)-我可以有一个列族-一个列配置(有效地尝试使其成为纯列)

有许多博客/维基解释了这一点,但它们似乎都相互矛盾,增加了更多的混乱。我似乎无法理解Hbase更喜欢一个列族这一事实,那么调用列存储又有什么意义呢?

目前(尽管这一点预计会改变),一个区域的所有列族都被刷新在一起。这就是人们说“HBase在超过2列或3列的系列中表现不佳”的主要原因。考虑两个CF,每个都有一个列。A列:A存储整个网页文本。列B:B存储页面中的字数。因此,每次我们刷新A:A时(由于A:A的数据大得多,这种情况会更频繁),我们还需要对B:B列执行整个单独的文件I/O杂耍路由,即使没有必要-由于B:B只保存数字,我可以在几个月内不刷新它

如果将A和B存储在同一列族(A:A和A:B)中,您可能会看到更好的刷新I/O性能,并且由于大多数HBase读取都是纯从memstore进行的,因此您可能会发现读取速度相当

而且,也许更重要的是,如果列的基数大不相同,那么您的RegionServer将需要为密度较低的列族维护无用的大部分为空的文件。这永远不会改变

所有这些都可以在中找到


因此,与所有此类性能情况一样,在确定“正确”路径之前,请先进行测量。

因此,就我的情况而言,据我所知,我有两种选择:a)我将所有列都放在一个列族中。这将对性能产生影响,因为大多数时候我只需要访问1-2列,但使用这种设计,我将阅读整行。尽管这些读取将分布在许多区域服务器上。2) 我将我的列按族划分,以便它们具有相似的大小。您可能不必担心读取整行。HBase非常擅长只阅读它实际需要的内容。如果需要读取的单元位于内存中,HBase将不执行任何额外的磁盘IO。