每行有大量版本的 HBase table 的性能成本?
Performance cost of HBase table with a high number of versions per row?
我们正在实施一种 HBase 存储机制,该机制将有一个 table 将利用(字符串)行键和(长)时间戳来维护单个行的多个版本。这是HBase的一个核心特性,对我们来说会非常有用。
在大多数情况下,行将只有十几个版本,并且所有单元格中每个版本的大小应该只有几 KB。然而,有一种边缘情况,其中一行可能有 数百 个版本,每个版本都有不同的时间戳,并且不清楚设置最大数量是否会有任何性能或扩展成本每行的版本数(就这一行 table)到“1000”(一千)。
就访问模式而言,当我们提取数据时,它将是以下之一:
- 根据行键
提取行的 "latest" 版本
- 在给定行键和时间戳的情况下提取行的指定版本
- 从每个单元格中取出一个单元格(称为 "ts"),其中包含一个 long
行的版本,给定行键
3) 中的最后一个是允许我们发现每一行存在哪些版本,而不必提取一行的所有版本。最坏的情况;我们最终会在 HBase Get 请求中返回 1000(一千)长。那将是 64 Kb。我们永远不需要在一个 Get 请求中请求行的每个版本上的每个单元格。
团队内部有人建议这可能会导致性能问题,但是,我们在 HBase 手册中找不到任何说明。
因此,考虑到上述情况,我的问题是 - 我们拥有一个 table 每行(可能)1000 个版本的性能成本吗?
A {row, column, version} tuple exactly specifies a cell in HBase. It’s
possible to have an unbounded number of cells where the row and column
are the same but the cell address differs only in its version
dimension.
While rows and column keys are expressed as bytes, the version is
specified using a long integer. ..... links
如您所见,HBase 被设计为具有最大版本 Integer.MAX_VALUE,但如果您插入接近该数字的版本,可能会有很多风险等着您。
- Number of Versions
37.1. Maximum Number of Versions The maximum number of row versions to store is configured per column family via HColumnDescriptor. The
default for max versions is 1. This is an important parameter because
as described in Data Model section HBase does not overwrite row
values, but rather stores different values per row by time (and
qualifier). Excess versions are removed during major compactions. The
number of max versions may need to be increased or decreased depending
on application needs.
It is not recommended setting the number of max versions to an
exceedingly high level (e.g., hundreds or more) unless those old
values are very dear to you because this will greatly increase
StoreFile size.
从官方文档我们可以得到一些关于你的问题的信息
首先压缩的时候很有可能内存不足。
其次单个rowkey的region不会被拆分
我们正在实施一种 HBase 存储机制,该机制将有一个 table 将利用(字符串)行键和(长)时间戳来维护单个行的多个版本。这是HBase的一个核心特性,对我们来说会非常有用。
在大多数情况下,行将只有十几个版本,并且所有单元格中每个版本的大小应该只有几 KB。然而,有一种边缘情况,其中一行可能有 数百 个版本,每个版本都有不同的时间戳,并且不清楚设置最大数量是否会有任何性能或扩展成本每行的版本数(就这一行 table)到“1000”(一千)。
就访问模式而言,当我们提取数据时,它将是以下之一:
- 根据行键 提取行的 "latest" 版本
- 在给定行键和时间戳的情况下提取行的指定版本
- 从每个单元格中取出一个单元格(称为 "ts"),其中包含一个 long 行的版本,给定行键
3) 中的最后一个是允许我们发现每一行存在哪些版本,而不必提取一行的所有版本。最坏的情况;我们最终会在 HBase Get 请求中返回 1000(一千)长。那将是 64 Kb。我们永远不需要在一个 Get 请求中请求行的每个版本上的每个单元格。
团队内部有人建议这可能会导致性能问题,但是,我们在 HBase 手册中找不到任何说明。
因此,考虑到上述情况,我的问题是 - 我们拥有一个 table 每行(可能)1000 个版本的性能成本吗?
A {row, column, version} tuple exactly specifies a cell in HBase. It’s possible to have an unbounded number of cells where the row and column are the same but the cell address differs only in its version dimension.
While rows and column keys are expressed as bytes, the version is specified using a long integer. ..... links
如您所见,HBase 被设计为具有最大版本 Integer.MAX_VALUE,但如果您插入接近该数字的版本,可能会有很多风险等着您。
- Number of Versions 37.1. Maximum Number of Versions The maximum number of row versions to store is configured per column family via HColumnDescriptor. The default for max versions is 1. This is an important parameter because as described in Data Model section HBase does not overwrite row values, but rather stores different values per row by time (and qualifier). Excess versions are removed during major compactions. The number of max versions may need to be increased or decreased depending on application needs.
It is not recommended setting the number of max versions to an exceedingly high level (e.g., hundreds or more) unless those old values are very dear to you because this will greatly increase StoreFile size.
从官方文档我们可以得到一些关于你的问题的信息
首先压缩的时候很有可能内存不足。
其次单个rowkey的region不会被拆分