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:原子“检查行不存在并创建”操作的主要内容,如果未能解决你的问题,请参考以下文章

spark读取hbase数据,如果表存在则不做任何操作,如果表不存在则新建表。

Pig + Hbase 原子增量列值

文件IO详解---原子操作之创建文件

HBase基本操作命令

HBase行锁和扫描

HBase操作注意事项