HBase checkAndPut 原子性说明

HBase checkAndPut atomicity clarification

我只是想根据 HBASE 的文档了解 HBASE checkAndPut 的工作原理,

Atomically checks if a row/family/qualifier value matches the expected value. If it does, it adds the put. If the passed value is null, the check is for the lack of column (ie: non-existance)

当它说 "Atomically" 时,我假设它会锁定并隔离该行并在执行 put 之前进行比较以防止对该行进行任何其他操作。 此外,checkAndPut 用于检查不存在,如果行键不存在,它将 isolate/lock?

对此我有两种说法:

  1. HBASE checkAndPut 不隔离任何不存在的行,这是否意味着当您对同一行同时不存在的行执行 checkAnPut 时,两者都会是否处理成功?

  2. 是否按行键隔离?

我只是想确认哪个是正确的实现,但对我来说理想的是第二个。

或者 HBASE checkAndPut 不适合用于检查行是否存在?也许只有当一行存在并且只检查 family/qualifier 时才使用它是理想的?因为 JAVA API 看起来像这样。

在尝试了解 checkAndPut 在行不存在的情况下的行为方式之前,您应该首先了解 mutations 在 HBase 中的工作方式。

HBase 中的突变

HBase 中的一个突变是任何写操作,例如PutDelete 等。由于 HBase 是一个强一致性系统,它为单行(跨列族)提供原子性保证,因此特定行的所有变更都必须通过同一台服务器。您应该阅读 HBase 文档中有关区域和区域服务器概念的更多信息,以了解 HBase 如何在一堆服务器之间划分为行键 space 的非重叠分区提供服务的责任。

每当区域服务器获取特定行的突变时,它都会在该行键的值上获取内存中的 write lock。这基本上意味着四件事:

  1. 由于一行只能由一个区域服务器写入,因此永远不会有超过一个服务器尝试写入同一行并获取同一行的锁。
  2. 由于锁在内存中,如果获取锁后服务器立即崩溃,锁会自动释放。该区域的责任随后将优雅地转移到新服务器,但您的操作会失败(不考虑客户端上的自动重试)。
  3. 由于写锁是针对整行的,对列 x 的更改将导致对同一行的列 y 的操作被阻塞。
  4. 由于锁定在行键的值上(区域服务器在内存中维护当前锁定行的列表),因此该行不一定必须事先存在。

CheckAndPut 在锁定语义方面与常规 Put 没有什么不同。唯一的区别在于它在锁定行键后执行额外的 Get 操作以验证该行键的列的现有值(它可以为空,行键可能根本不存在) ).这也是生成 Put 的行键必须与生成 Get 操作的行键相同的原因。否则,内存中锁定语义将无法提供一致性保证。 这与 HBase 的其他 ACID 保证配合得很好,这些保证也仅在单行级别提供。