试图了解 HBase 中的更新

Trying to understand updates in HBase

我在下面的链接中读到 HBase 不支持更新,其中说 HBase 是一个“仅附加”存储。

HBase update operation

此外,我知道可以使用 put 命令更新 HBase 中的现有单元格值,只需遵循相同的语法并提及新值即可。

例如,可以按照以下操作将城市列的值从 'Boston' 更新为 'Chicago':

put 'emp','row1','personal:city','Chicago'

当上一行是:

row1 column = personal:city, timestamp = 1418275907, value = Boston

在 HBase 中,可以为列族启用版本控制,并具有多个值,这些值可以具有相同的“行键 + 列族 + 列限定符”值。可以使用 PUT 来创建或更新任何单元格的值。进行版本控制后,还可以访问以下 post:

中提到的旧值

基于这些,我有以下疑惑:

  1. 为什么说HBase不支持更新,如上所示可以更新(如上例城市值从'Boston'更新为'Chicago') ?

  2. HBase 也通过保留以前的版本来进行版本控制。为什么还要保留以前的值?

谢谢。

Why is it said that HBase does not support updates when one can update as shown above

HBase 确实不明确支持更新操作。像您描述的那样的更新只是 put 操作的结果。

HBase does versioning by keeping previous versions too. What is the reason for keeping previous values too?

HBase 仅在您要求时保留多个版本的记录。默认情况下,它只会保留 1 个版本的记录,这与 un-versioned 存储一样必不可少。 getscan 操作通常只获取最新版本的记录。更多信息 here.

比方说,我们有一个空的 table,其列族配置为保留记录的最后 3 个版本。我们在不同的时间戳 t=x.

执行 3 put 操作
put 'a','myrow','d:mood','happy' // at t=1
put 'a','myrow','d:mood','sad'   // at t=2
put 'a','myrow','d:mood','bored' // at t=3

此时 rowkey myrow 对应的 HFile 中存储的数据看起来与此类似(仅供说明)

row_key | timestamp |  value
myrow   | 1         | d:mood=happy
myrow   | 2         | d:mood=sad
myrow   | 3         | d:mood=bored

现在,如果您对 rowkey myrow 执行 get 操作,默认情况下它只会获取 d:mood=bored 因为具有最高时间戳值,因此是记录的最新版本。我们可以看到旧记录没有被我们的 put 操作更新。这就是他们说 HBase 不支持更新的意思。只有新记录被创建,从而给我们一种错觉,即记录正在被我们的 put 操作更新。在这种情况下,如果我们继续对同一个 rowkey 执行另一个 put 操作,则记录的最旧版本将失效(因为我们只配置了最多保留 3 个版本)并将被删除在下一个压缩周期。