HBase:原子性的“检查行不存在并创建”操作

4
我建议这应该是常见情况之一,但可能是因为我在谷歌搜索时使用了错误的关键字。
我只需要创建一个完全随机的键的新表记录。假设我获得了具有良好随机性(几乎是随机的)的键。但是我不能百分之百确定尚不存在任何行。那么我需要原子地执行以下操作:
  • 检查是否存在行键。
  • 如果行已存在,则拒绝操作。
  • 如果不存在,则创建行。
我找到了关于 HBase 行锁 的最有用的信息。我认为 HBase 行锁是合适的解决方案,但我想以更好的方式进行,而不需要显式行锁定。
  • ICV 看起来不合适,因为我确实希望键是随机的。
  • CAS 将是很好的选择,如果它们可以在“行不存在”的条件下工作,但看起来它们无法。
  • 显式行锁定具有缺点,例如区域分割问题。
请问有人能添加有用的建议吗? 首选的 API 是基于 Java 的,但实际上更多的是概念而不是实现。

1
这可能是一个适合HBase开发者或用户列表的好问题:http://hbase.apache.org/mail-lists.html - Ian Varley
1个回答

10
此案例中“足够好”的解决方案是基于 checkAndPut() 方法。我的意图是进行带有重复键检查的新行插入,对于单个插入,该解决方案是完美的:
- HTable checkAndPut() 方法可以检查某些列是否未设置(将其检查为null 值)。 - 由于行始终包含一些“ID”字段,该字段是所有对象的必需字段(您可以使用任何其他始终设置为您对象的字段),因此可以检查行是否存在。 - 传递给 checkAndPut()Put 对象应包含具有强制性字段设置的初始对象状态。
对于大规模插入(我真正需要的内容),它变得太慢了,因此我转而使用UUID作为行键,在新行插入时没有进行任何检查。对我来说,这更好。在这种情况下唯一需要考虑的是良好的随机生成器。标准Java java.util.UUID类包含我需要的所有内容,包括它基于相当慢但非常强的java.security.SecureRandom生成器。
请注意:看起来HBase用户行锁定功能将因与使用相关的安全/其他风险而被删除。

从我在checkAndPut()文档中看到的,这个API没有批量Put的方式,对吗? - linehrr

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