【问题标题】:Hbase Atomic read and delete a rowHbase Atomic 读取和删除一行
【发布时间】:2015-09-17 07:09:27
【问题描述】:

我们使用一个 hbase 表作为一个大队列。许多客户端可以插入其中,并且许多客户端想要从中读取数据。问题是互斥。在客户端读取数据直到删除它的范围内,另一个客户端也可以读取它!但我们要确保每一行都返回一个且只有一个客户端。

我应该提到我们正在使用 Java hbase 客户端。

有没有办法像原子地获取和删除一行或在 hbase 中获取和更新,或者有什么办法可以管理这种情况?

我找到了 RowLock 机制,但它已被弃用并且不再存在。还有一个使用zookeeper的分发锁,但似乎效率不高。

提前致谢。

【问题讨论】:

    标签: java hbase apache-zookeeper mutual-exclusion


    【解决方案1】:

    试试那个方法

    1. 获取所需的行。签入没有被一个人使用的java代码(特定列==0)。
    2. 检查该行是否存在且未被任何人使用。如果是,则标记它(即,将列值从 0 增加到 1)x。所有这些都可以通过 checkAndPut 完成
    3. 使用 checkAndDelete 删除行。

    【讨论】:

    • 简单而优秀的想法。但是我刚刚删除了第二步,但是如果我可以成功删除一行,我想该行是我的,我将其返回,但如果我不能删除它,这意味着另一个客户已经删除了它(并拥有它)并且我'将查询下一行。
    • 听起来很合理。只有一点:如果您删除了一行并且处理它的线程发生了一些事情,您将丢失数据。
    • 由于某些其他原因,我有一个备份表,如果客户说我完成了数据,那么我也从备份表中删除行,否则我从备份表中恢复数据。
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2016-02-07
    相关资源
    最近更新 更多