【问题标题】:checkAndPut always succeedscheckAndPut 总是成功
【发布时间】:2017-10-25 17:24:47
【问题描述】:

我在 bigtable 中保留一个计数器,并希望在计数器到达 X 时放入一些数据。我目前正在这样做:

Put put = new Put(EXAMPLE_ROW_KEY);
put.addColumn(EXAMPLE_COLUMN_FAMILY, NEW_QUALIFIER, NEW_VALUE);

boolean success = table.checkAndPut(EXAMPLE_ROW_KEY, 
                                    INFO_COLUMN_FAMILY_NAME,
                                    SIZE_COLUMN,
                                    CompareFilter.CompareOp.LESS, 
                                    Bytes.toBytes(10000L), put);

问题是,即使尺寸超过 10000L,成功总是真实的,并且总是赋予新的价值。我尝试使用具有完全相同的值的CompareFilter.CompareOp.GREATER_OR_EQUAL,但它仍然是正确的。

bigtable 不支持 checkAndPut,还是我做错了什么?

【问题讨论】:

    标签: java hadoop bigtable google-cloud-bigtable


    【解决方案1】:

    我们确实支持 Cloud Bigtable 中的 table.checkAndPut 操作。

    但一般来说,尝试以这种方式使用 CompareFilter 并不是一个好习惯,因为它是对字节执行词法比较,而不是逻辑整数比较。

    有关更多信息和上下文,请参阅:

    至于主要的 HBase API,我们计划在未来的 HBase 版本中更好地处理这个问题,例如在提议的 HBase 2.0 中,它结合了受有序项目启发的新 OrderedBytes 数据类型:

    与此同时,您可能能够以某种方式有序地合并,或者可能使用 HBase 计数器和增量操作。

    【讨论】:

    【解决方案2】:

    问题是,我正在使用依赖项bigtable-hbase-1.2:0.9.6.2,它可能与另一个依赖项发生冲突。我认为这会导致不正确的CheckAndMutateRequest 被静默发送,并且checkAndPut 中的检查始终通过。我切换到bigtable-hbase-1.2:0.9.2,一切都被正确评估了。

    【讨论】:

    • 有趣,感谢更新。很高兴您畅通无阻,但似乎这也可能表明回归,因此 Cloud Bigtable 工程团队将对此进行进一步调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2013-03-12
    相关资源
    最近更新 更多