我只是想根据hbase的文档,弄清楚hbase checkandput是如何工作的,
自动检查行/族/限定符值是否与预期值匹配。如果有,就加上看跌期权。如果传递的值为null,则检查是否缺少列(即:不存在)
当它说“atomically”时,我假设它将锁定并隔离该行,并在执行put之前进行比较,以防止对该行执行任何其他操作。另外,checkandput用于检查不存在,如果行键不存在,它将隔离/锁定什么?
我有两个理论:
如果某行不存在,hbase checkandput不隔离该行,是否意味着当您对不存在的同一行同时执行checkandput时,这两行都将成功处理?
是按行键隔离的吗?
我只是想确认哪一个是正确的实现,但对我来说,理想的是第二个。
或者hbase checkandput不适合用于检查行的存在?也许只有在存在行并且只检查族/限定符时才使用它才是理想的?因为javaapi看起来是这样的。
1条答案
按热度按时间1rhkuytd1#
在试图理解
checkAndPut
在不存在行的情况下,您应该首先了解mutations
在hbase工作。hbase突变
hbase突变是任何写操作,例如。
Put
,Delete
由于hbase是一个强一致性系统,并且它为一行(跨列族)提供原子性保证,因此特定行的所有突变都必须经过同一个服务器。您应该阅读hbase文档中有关region和regionservers概念的更多内容,以了解hbase如何将为行键空间的非重叠分区提供服务的责任划分到多个服务器上。每当regionserver获取特定行的变异时,它都会在内存中获取一个
write lock
在该行键的值上。这基本上意味着四件事:由于一行只能由一个regionserver写入,因此决不能有多个服务器尝试写入同一行并获取锁。
由于锁在内存中,如果在获取锁后服务器立即崩溃,锁将自动释放。然后,区域的责任将优雅地转移到新服务器,但您的操作将失败(不考虑在客户端上自动重试)。
因为写锁是针对整行的,所以对列的一个变异
x
将导致操作失败y
在同一行被阻止。因为锁是在row键的值上的(regionserver在内存中维护一个当前锁定行的列表),所以该行不必预先存在。
CheckAndPut
和普通人没什么区别Put
在锁定语义方面。唯一的区别在于它有额外的功能Get
锁定行键后的操作,以验证该行键的列的现有值(可以为null,行键可能根本不存在)。这也是行键Put
必须与Get
生成操作。否则,内存锁定语义将无法提供一致性保证。这与hbase的其他acid保证很好地配合,它们也仅在单行级别提供。