【问题标题】:HBase performance with large number of dynamically generated column qualifiers (within a column family)具有大量动态生成的列限定符(列族内)的 HBase 性能
【发布时间】:2014-01-08 09:16:06
【问题描述】:

我有一个名为“A”的包含 1 个列族的表。 在运行时,我会将 (Key-Value) 对插入到表中。 离开 RowKey,在我的设计中,列限定符是 MD5(Key)所以,列限定符是动态创建的单元格将包含对应的值。

例如:每辆车都有一个车牌。我想将所有内容插入到 HBase 中的一张表中。 A车有rowkey R1,column qualifier是C1,value是A的车牌。B车有rowkey R2, , column qualifier 是 C2,value 是 A 的牌照,反之亦然。使用该模式,当执行 Scan 命令时,rowkey = R1,是 column qualifier C2 中包含的单元格返回(在这种情况下,它是确定为空)?

我想问一些关于表演的问题:

  1. 使用这种架构设计,Scan 命令的性能会降低吗? (我想扫描表上的所有值)。对于每一行,是否将返回所有列?

  2. 有上述要求,谁能指点我设计这张桌子的正确方法?

非常感谢!

【问题讨论】:

    标签: hbase schema-design


    【解决方案1】:

    不,scan的性能不会下降。这就是HBASE的美妙之处。

    我处理过类似的结构和庞大的数据集,检索速度非常快。

    我认为对于处理这种情况,HBASE 中不同的filters 会有很大帮助。

    您也可以参考HBASE:Defenitive guide. 中的 HBASE 过滤器 HBASE 中好的过滤器之一是前缀过滤器。 如果你在 JAVA 中工作,它看起来有点像这样,

    Scan s = new Scan();
    Filter filter = new PrefixFilter(Bytes.toBytes("car_"+i));
    s.setFilter(filter);
    

    这里不同汽车的 rowkeys 可以是“car_[liscence number OR car number]”。因此,即使您只想从数十万行中提取一行,也可以在几秒钟内完成。

    【讨论】:

      【解决方案2】:

      拥有许多细粒度的单元格有时会成为您的敌人,因为行键、族和限定符(它们结合起来构成实际的“键”)可能会大量重复。这会增加您数据的空间占用,进而影响访问速度。

      如果您遇到此问题,您可以考虑通过几种不同的方式将逻辑单元合并为更大的物理“多单元”:

      • 通过将同级字段打包到“结构”中,您可以将字段成员组合到一个类中
      • 通过加入具有共同限定符前缀的单元格(例如,每个 MD5 的前半部分)。如果前缀相似性意味着访问局部性,这尤其适用。

      有一个OpenTSDB slide deck 讨论了它如何整合类似的想法。

      请注意,较新版本的 HBase 可能允许您使用基于 trie 的数据块编码。这种数据结构自然有助于消除磁盘上的前缀冗余,从而减少对这些模式技巧的需求。请参阅HBASE-4676HBASE-7162

      【讨论】:

        【解决方案3】:

        HBase 以稀疏格式存储数据。每个单元格都存储为“键、列族、列限定符、版本、值” 对表的扫描仅生成具有值的列限定符。即使您的设计指定了在整个表中本质上是唯一的列限定符,但在扫描表期间,每一行将只产生一个值(根据您的描述),并且不会为仅包含的列限定符返回无关的空值在另一行定义。

        您已经描述了桌子的设计。您可以在没有任何进一步问题的情况下实施它。需要根据用例来表述设计问题,以了解您是否选择了性能良好的设计。

        【讨论】:

          【解决方案4】:

          我想问一些关于表演的问题:

          1. 使用这种架构设计,扫描命令的性能会降低吗? (我想扫描表格上的所有值>)。对于每一行,是否将返回所有列?

          2. 有上述要求,谁能指点我设计这张桌子的正确方法?

          1. 没有。仅针对此特定行键添加的列。
          2. 您能回答为什么需要动态创建的限定符吗?我建议对所有行键使用相同的限定符名称。例如,您可以拥有列族“car-info”和限定符 - “license-plate”,以及“make”、“model”、“year”等。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多