2012-03-05 71 views
9

Hbase文档说,避免创建2-3个以上的列族,因为Hbase不能很好地处理2-3列以上的族。其原因是压实和冲洗,因此IO。然而,如果我所有的列都被填充(对于每一行),那么我认为这个推理并不重要,所以考虑到我对列的访问完全是随机的(我想访问列的任意组合) - 我可以有一个列列家族 - 一个列配置(有效地尝试使其成为纯粹的列)。Hbase列族

有很多博客/维基解释这个,但他们似乎都相互矛盾,并添加更多的困惑。我似乎无法消化Hbase喜欢一个列家族的事实,那么调用的是什么是一个列存储?

回答

21

目前(虽然预计会改变),但是一个区域的所有列族都会被刷新。这就是为什么人们说“HBase不适合超过2或3个专栏家庭”的主要原因。考虑两个CF,每个都有一列。 A栏:存储整个网页文本。 B列:B存储页面中的字数。因此,每次我们刷新A:A(由于A:A的数据更大,会更频繁地发生),我们还需要通过一个单独的文件I/O对B列的I/O杂耍路由:即使没有需要 - 与B:B只持有号码,我可以去几个月没有冲洗它。

如果您将A和B存储在相同的列系列(A:A和A:B)中,您可能会看到非常好的I/O性能,并且由于大多数HBase读取完全来自memstore,所以可能会发现读取速度是相同的。

此外,也许更重要的是,如果列的基数是非常不同的,那么您的regionservers将需要为较不密集的列族维护无用的大多数空文件。这永远不会改变。

所有这些都在HBase Book中可用。

因此,正如在所有这些表现情况下,测量在决定“正确”路径是什么之前。

+0

感谢您的解释! – PrakashT 2012-03-05 15:27:54

+0

所以就我而言,据我所知,我有两种选择:a)我有一列家族中的所有列。这将对性能产生影响,因为大部分时间我只需要访问1-2列,但通过这种设计,我将阅读整行内容。尽管这些读取将分布在许多区域服务器上。 2)我把我的专栏分成几个大小相同的家庭。 – PrakashT 2012-03-05 15:32:53

+2

您应该不必担心阅读整行。 HBase非常适合只读实际需要的内容。如果您需要读取的单元在内存中,HBase根本不会执行额外的磁盘IO。 – 2012-03-05 17:07:48