每行具有大量版本的HBase表的性能成本?

时间:2018-06-20 14:47:16

标签: java hbase

我们正在实现一种HBase存储机制,该机制将具有一个表,该表将使用(字符串)行键和(长)时间戳来维护单个行的多个版本。这是HBase的核心功能,对我们非常有用。

在大多数情况下,这些行将只有十几个版本,并且每个版本在所有单元格中的大小应仅为几KB。但是,在极端情况下,一行可能有数百个版本,每个版本都有不同的时间戳记,并且不清楚是否有任何性能或扩展成本来设置每个版本的最大版本数行(仅在此一张表上)到“ 1000”(一千)。

就访问模式而言,当我们提取数据时,它将是以下之一:

  1. 根据行键拔出该行的“最新”版本
  2. 根据行键和时间戳,提取出该行的指定版本
  3. 从每个单元格中抽出一个长单元格(称为“ ts”) 该行的版本,给出行键

最后,在3)中是让我们发现每一行存在哪些版本,而不必提取一行的所有版本。最坏的情况是;我们最终将在HBase Get请求中取回1000(一千)长。那将是64 Kb。我们将永远不需要在一个Get请求中请求一行的每个版本中的每个单元格。

团队内部曾有建议,这可能会导致性能问题,但是,我们无法在HBase手册中找到任何一种解释。

因此,鉴于以上所述,我的问题是-对于我们而言,每行具有(可能)1000个版本的表是否对性能造成任何影响?

1 个答案:

答案 0 :(得分:2)

  

一个{行,列,版本}元组精确地指定了HBase中的一个单元。它的   可能有无限数量的单元格,其中行和列   相同,但单元地址仅在版本上有所不同   尺寸。

     

当行键和列键表示为字节时,版本为   使用长整数指定。 ..... links

如您所见,HBase设计为具有Integer.MAX_VALUE的最大版本,但是如果您插入一个接近该数字的版本,则等待您的风险可能很大。

  
      
  1. 版本数   37.1。最大版本数通过HColumnDescriptor为每个列系列配置要存储的最大行版本数。的   最高版本的默认值为1。这是一个重要参数,因为   如数据模型部分所述,HBase不会覆盖行   值,而是按时间在每行中存储不同的值(和   限定词)。大型压缩期间将删除多余的版本。的   最大版本数可能需要增加或减少   根据应用需求。
  2.   
     

不建议将最大版本数设置为   (例如数百或更高)   值对您很重要,因为这会大大增加   StoreFile大小。

从官方文档中我们可以获取有关您的问题的一些信息

首先,紧凑时可能会内存不足。

第二个单个行键的区域不会被分割。