HBase checkAndPut 原子性澄清

4
我只想澄清一下HBASE checkAndPut的工作原理,基于HBASE文档,"Atomically"检查是否存在一个行/列族/限定符值与期望值匹配。如果是,它就会添加这个put。如果传递的值为空,则检查是否缺少列(即:不存在)。当它说“Atomically”时,我认为它会锁定并隔离该行,在对其进行比较之前执行put,以防止该行的任何其他操作。另外,checkAndPut可以用于检查不存在情况,如果行键不存在,它会隔离/锁定什么?
我有两种理论:
要么HBASE checkAndPut不会隔离任何不存在的行,这是否意味着在同时对同一行进行checkAndPut操作时,两者都会成功处理?
或者它会通过行键隔离?
我只是想确认哪种实现是正确的,但对我来说,理想情况应该是第二种。或者,HBASE checkAndPut在检查行的存在性时并不理想?也许只有在行存在且仅检查家族/限定符时才理想使用?因为JAVA API看起来像这样。
1个回答

2
在理解checkAndPut在不存在行的情况下如何运作之前,您应该首先了解HBase中的mutations是如何工作的。
HBase中的mutation指任何写入操作,例如PutDelete等。由于HBase是一个强一致性系统,并且它为单个行(跨列族)提供原子性保证,因此特定行的所有变更都必须通过同一台服务器进行。您应该阅读HBase文档中有关区域和区域服务器概念的更多信息,以了解HBase如何将服务非重叠行键空间分区的责任分配给一组服务器。
每当区域服务器获取特定行的变更时,它会在该行键的值上获取内存中的写锁。这实际上意味着四件事:
  1. 由于一行只能由一个区域服务器编写,因此永远不可能有多个服务器尝试编写并获取同一行的锁。
  2. 由于锁在内存中,如果服务器在锁获取后立即崩溃,则锁会自动释放。区域的责任将优雅地移动到新服务器,但您的操作将失败(不考虑客户端的自动重试)。
  3. 由于写锁是针对整行的,对同一行的列x的变更将导致对列y的操作被阻塞。
  4. 由于锁定的是行键值(区域服务器在内存中维护当前锁定行的列表),因此该行不一定需要事先存在。
CheckAndPut在锁定语义方面与常规Put没有任何不同。唯一的区别在于它在锁定行键后执行额外的Get操作,以验证该行键的某个列的现有值(它可以为null,该行键可能尚不存在)。这也是生成Put的行键必须与生成Get操作的行键相同的原因。否则,内存中的锁定语义将无法提供一致性保证。
这与HBase的其他ACID保证很好地配合使用,这些保证仅在单个行级别提供。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接