HBase 列族:有多少?

Posted

技术标签:

【中文标题】HBase 列族:有多少?【英文标题】:HBase column families: how many? 【发布时间】:2012-10-07 15:19:35 【问题描述】:

可能有很多类似的问题,但他们没有回答我的场景(至少我无法理解这一点)。

比方说,我在 HBase 中有一个包含 4 个列族的表。主要原因是每个列族都有不同的 VERSIONS 属性(非常不同)。

所有族的所有列都不是存储大数据(例如全文),而是平均1KB(长的标识符,一些短字符串,整数等)

我需要通过几种方式访问​​数据:按列族扫描和获取,按版本(特定版本或范围)获取给定行的所有单元格,最后但并非最不重要的一点:获取最新版本的给定行的所有列。

那么,在这种情况下,拥有 4 个列族的缺点是什么?读取效率是否较低,因为它们在不同的存储文件上操作(如果行不在内存中)?

【问题讨论】:

【参考方案1】:

HBase 中的列族数量是有限制的。每个 Column Family 有一个 MemStore(它是一个写入缓存,用于在将新数据写入 Hfile 之前存储新数据),当一个已满时,它们都会刷新。

您添加的列族越多,创建的 MemStore 就会越多,并且 Memstore 刷新会更频繁。它会降低性能。

【讨论】:

【参考方案2】:

列族背后的想法很棒 - 不幸的是,当前的 HBase 实现不能很好地处理很多列族。基本上,如果您有完全不同的访问模式,您应该尝试坚持使用一个并添加第二个。另见HBase manual

您可以做的是将不同的“家庭”保留为具有不同前缀的列。 HBase 是稀疏的,因此它不会占用更多空间,如果需要,您仍然可以在扫描时获得一个带有 columnPrefix 过滤器的“家庭”

【讨论】:

【参考方案3】:

根据 Apache HBase wiki Hbase 将面临超过 2 或 3 个列族的性能问题。

【讨论】:

【参考方案4】:

当 MemStore 积累了足够的数据时,整个排序集被写入 HDFS 中的新 HFile。 HBase 每个列族使用多个 HFile,其中包含实际的单元格或 KeyValue 实例。这些文件随着时间的推移而创建,因为在 MemStore 中排序的 KeyValue 编辑作为文件刷新到磁盘。

请注意,这是 HBase 中列族数量受到限制的原因之一。每个 CF 有一个 MemStore;当一个满了,他们都冲水。它还保存最后写入的序列号,以便系统知道到目前为止保存的内容。添加的列族越多,创建的 MemStore 就越多,Memstore 刷新的频率也会更高。

【讨论】:

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

HBase建表的基本命令

hbase学习笔记

为啥说hbase是一个面向列的数据库?

为啥说hbase是一个面向列的数据库?

Hbase

Hbase 列族