HBase:原子“检查行不存在并创建”操作
Posted
技术标签:
【中文标题】HBase:原子“检查行不存在并创建”操作【英文标题】:HBase: atomic 'check row does not exist and create' operation 【发布时间】:2013-04-30 07:20:12 【问题描述】:我建议这应该是常见的情况之一,但可能我在谷歌搜索时使用了错误的关键字。
我只需要用完全随机的键创建新的表记录。假设我获得了具有良好随机性(几乎随机)的密钥。但是我不能 100% 确定没有行存在。所以我需要原子地做些什么:
让行键检查不存在行。 如果行存在则拒绝操作。 如果行不退出,则创建行。我在这个主题上找到的最有用的信息是关于 HBase row locks. 的文章 我认为 HBase 行锁是合适的解决方案,但我想在没有显式行锁定的情况下做得更好。
ICV 看起来不合适,因为我确实希望密钥是随机的。 如果 CAS 可以在“行不存在”的情况下工作,那会很棒,但看起来他们不能。 显式行锁有一些缺点,例如区域拆分问题。有人可以添加有用的建议吗? 优选的 API 是基于 Java 的,但实际上它更多的是关于概念而不是实现。
【问题讨论】:
这可能是 HBase 开发人员或用户列表的一个好问题:hbase.apache.org/mail-lists.html 【参考方案1】:这个案例的“足够好”的解决方案恰好基于checkAndPut()
method。我打算做的是带有键重复检查的新行插入,并且对于单个插入解决方案是完美的:
HTable checkAndPut()
方法可以检查某些列是否未设置(检查它的 null
值)。
因为行无论如何都包含一些“ID”字段,这对所有人都是强制性的
对象(您可以使用您始终为您的对象设置的任何其他字段
object) 可以检查行是否存在。
Put
传递给 checkAndPut()
的对象将包含初始
具有强制字段集的对象状态。
好吧,对于批量插入(我真正需要的),它碰巧太慢了,所以我转移到用作行键的 UUID 而不对新行插入进行任何检查。对我来说,这要好得多。在这种情况下,唯一需要考虑的是非常好的随机生成器。标准 Java java.util.UUID
类包含我需要的一切,包括它基于有点慢但相当强大的 java.security.SecureRandom
生成器。
请注意:由于与使用相关的安全/其他风险,HBase 用户行锁定功能似乎将被删除。
【讨论】:
从我在文档中看到的关于checkAndPut()
的内容来看,没有办法批量放入这个API 对吗?以上是关于HBase:原子“检查行不存在并创建”操作的主要内容,如果未能解决你的问题,请参考以下文章