HBase 批处理操作是原子的


// Create a list of Puts, and save in HBase via HTable's batch method
HTable table = new HTable(HBaseConfiguration.create(), 'table_name');
List<Row> actions = new ArrayList<Row>();
actions.add(put1); //rowkey = 'abc'
actions.add(put2); //rowkey = 'def'
actions.add(put3); //rowkey = 'ghi'
Object[] results = table.batch(actions);

这种截图是否可能导致至少一个(但不是全部)看跌期权无法保存到 HBase?换句话说,batch是否保证原子地发生,要么所有puts都保存下来,要么全部都保存下来?

如果batch不能保证这一点,我们如何确定哪些看跌期权成功,哪些失败?或者,我们能否至少确定某些内容失败,这会告诉我们删除我们尝试保存的所有行以回滚它们?

当我将结果投射到Result并打印出来时,它返回keyvalues=NONE,但我可以看到我的看跌成功了。

来自 hbase 客户端 api 文档:

public void batch(List<? extends Row> actions, Object[] results)

获取、放置、删除、递增、追加的操作列表

对象

结果 空对象[],大小与操作相同。提供对部分结果的访问,以防引发异常。结果数组中的 null 表示对该操作的调用失败,即使在重试后也是如此

您可以检查每个结果是否成功,因为您在问题中感到难过,除了批量操作在 hbase 中不是事务性的,行变化操作可能会发生在不同区域的服务器,因此不同的 wal 文件,所以它不能是事务性的,有一些开源项目试图让这种情况发生作为检查结果并回滚成功的。

最新更新