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

时间:2014-01-08 09:16:07

标签: hbase schema-design

我有一个名为'A'的列系列表。 在运行时,我将(键值)对插入表中。 离开RowKey,在我的设计中,列限定符是MD5(键)因此,列限定符是动态创建的单元格将包含相应的价值。

例如:每辆车都有车牌。我想在HBase中将所有表插入到一个表中。 Car A有 rowkey R1,列限定符是C1,是A的车牌。车B有 rowkey R2 ,, 列限定符为C2,为A的牌照,反之亦然。使用模式,执行扫描命令时, rowkey = R1,列限定符 C2中包含的单元格返回(在这种情况下,它是确定无效)?

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

  1. 使用此架构设计,扫描命令的性能是否会降低? (我想扫描桌子上的所有值)。每行都会返回所有列吗?

  2. 根据上述要求,有人能指出我设计此表的正确方法吗?

  3. 非常感谢!

4 个答案:

答案 0 :(得分:2)

不,扫描的性能不会下降。这就是HBASE的美丽。

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

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

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

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

这里不同车型的行键可以是“car_ [liscence number OR car number]”。所以,即使你想从行中提取一行,也可以在几秒钟内完成。

答案 1 :(得分:2)

有许多细粒度的细胞有时可能是你的敌人,因为行键,族和限定符(它们结合起来构成实际的"键")可能会被大量复制。这会增加数据的空间占用空间,进而影响访问速度。

如果这个问题适用于您,您可以考虑将逻辑单元合并为更大的物理多单元格#34;以几种不同的方式:

  • 将兄弟字段打包成" structs",将字段成员合并为一个类的方式
  • 通过连接具有公共限定符前缀的单元格(例如,每个MD5的前半部分。)如果前缀相似性意味着访问位置,则这尤其适用。

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

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

答案 2 :(得分:1)

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

您已经为该表描述了一种设计。您可以毫不费力地实施它。设计问题需要根据用例来表达,以了解您是否选择了性能良好的设计。

答案 3 :(得分:0)

  

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

     
      
  1. 使用此架构设计,扫描命令的性能是否会降低? (我想扫描表格中的所有值>)。每行都会返回所有列吗?

  2.   
  3. 根据上述要求,有人能指出我设计此表的正确方法吗?

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