Hbase 列族

Posted

技术标签:

【中文标题】Hbase 列族【英文标题】:Hbase column family 【发布时间】:2012-03-05 14:49:22 【问题描述】:

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

有许多博客/wiki 对此进行了解释,但它们似乎都相互矛盾并增加了更多的混乱。我只是似乎无法消化 Hbase 偏爱一个列族的事实,那调用列存储有什么意义呢?

【问题讨论】:

【参考方案1】:

目前(尽管预计会发生变化),一个区域的所有列族都被一起刷新。这就是人们说“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,您可能会发现读取速度相当。

此外,也许更重要的是,如果列的基数差异很大,那么您的区域服务器将需要为密度较低的列族维护无用的大部分为空的文件。这永远不会改变。

所有这些都可以在HBase Book 中找到。

因此,在所有此类性能情况下,测量,然后再决定“正确”路径是什么。

【讨论】:

因此,就我而言,据我所知,我有两个选择:a) 我将所有列都放在一个列族中。这将对性能产生影响,因为大多数时候我只需要访问 1-2 列,但是通过这种设计,我将读取整行。尽管这些读取将分布在许多区域服务器上。 2)我将我的专栏分成不同的家庭,使它们的大小相似。 您可能应该停止担心阅读整行。 HBase 非常擅长只读取它实际需要的内容。如果需要读取的单元格在内存中,HBase 根本不会做额外的磁盘 IO。

以上是关于Hbase 列族的主要内容,如果未能解决你的问题,请参考以下文章

HBase 列族:有多少?

将多个列族从 hbase 导入到 hive

HBase-2HBase的原理和架构

HBASE表设计

为什么不建议在 HBase 中使用过多的列族

为什么不建议在 HBase 中使用过多的列族