具有大量动态生成的列限定符的HBase性能(在列族中)

具有大量动态生成的列限定符的HBase性能(在列族中),hbase,schema-design,Hbase,Schema Design,我有一个表,有一个列族叫做“a”。 在运行时,我将向表中插入(键值)对。 离开行键,在我的设计中,列限定符是MD5(键)因此,列限定符是动态创建的,单元格将包含相应的值 每辆车都有牌照。我想在HBase中将所有内容插入到一个表中。A车有行键R1,列限定符是C1,值是A的车牌号。B车有行键R2,列限定符是C2,值是A的车牌号,反之亦然。对于模式,当执行Scan命令且rowkey=R1时,列限定符C2 return中是否包含单元格(在本例中,它是确定的null) 我想问一些关于表演的问题: 使用此模

我有一个表,有一个列族叫做“a”。 在运行时,我将向表中插入(键值)对。 离开行键,在我的设计中,列限定符是MD5(键)因此,列限定符是动态创建的,单元格将包含相应的值

每辆车都有牌照。我想在HBase中将所有内容插入到一个表中。A车有行键R1,列限定符是C1,值是A的车牌号。B车有行键R2,列限定符是C2,值是A的车牌号,反之亦然。对于模式,当执行Scan命令且rowkey=R1时,列限定符C2 return中是否包含单元格(在本例中,它是确定的null)

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

  • 使用此模式设计,扫描命令的性能是否会降低?(我想扫描表上的所有值)。对于每一行,是否返回所有列

  • 根据以上要求,有人能告诉我设计这个表的正确方法吗


  • 多谢各位

    不,扫描性能不会降低。这就是HBASE的优点

    我处理过类似的结构和庞大的数据集,检索速度惊人

    我认为,对于处理这种情况,HBASE中的差异将有很大帮助

    您还可以从中参考有关HBASE筛选器的信息 HBASE中的一个好过滤器是前缀过滤器。 如果您在JAVA中工作,它看起来有点像这样

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

    在这里,不同汽车的行键可以是“汽车号或汽车号”。因此,即使您只想从成千上万的行中提取一行,也可以在几秒钟内完成。HBase以稀疏格式存储数据。每个单元格都存储为“键、列族、列限定符、版本、值”,表上的扫描只生成有值的列限定符。即使您的设计指定的列限定符在整个表中本质上是唯一的,但在扫描表期间,每一行将只生成一个值(根据您的描述),并且对于仅在另一行上定义的列限定符,不会返回任何无关的空值


    您已经描述了表的设计。您可以在没有任何其他问题的情况下实现它。设计问题需要根据用例进行措辞,以了解您是否选择了性能良好的设计。

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

    如果这个问题适用于你,你可以考虑用几种不同的方式将逻辑单元合并成更大的、物理的“多个单元”:

    • 通过将同级字段打包到“结构”中,可以将字段成员组合到一个类中
    • 通过加入具有公共限定符前缀(例如,每个MD5的前半部分)的单元,这尤其适用于前缀相似性意味着访问位置的情况
    有一篇文章讨论了如何将类似的想法结合起来

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

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

  • 使用这种模式设计,Scan命令的性能会下降吗?(我想扫描表上的所有值>)。对于每一行,是否返回所有列

  • 根据以上要求,有人能告诉我设计这个表的正确方法吗

  • 否。仅限为此特定行键添加的列
  • 你能回答为什么你需要动态创建的限定符吗?我建议对所有行键使用相同的限定符名称。例如,您可以有“汽车信息”列和限定符-“车牌”,以及“品牌”、“车型”、“年份”等