HBase批量操作原子?

时间:2016-02-02 03:30:04

标签: java 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);

这个snippit是否有可能导致至少有一个但不是全部的put无法保存到HBase?换句话说,batch是否保持原子地发生,其中所有puts都被保存,或者都没有保存?

如果batch无法保证这一点,我们如何确定哪些投注成功,哪些失败?或者,我们是否至少可以确定某些内容失败,这会告诉我们删除我们尝试保存的所有行以便将其回滚?

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

1 个答案:

答案 0 :(得分:1)

来自hbase客户端api文档:

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

操作获取,放置,删除,增量,附加列表

objectsresults 空对象[],大小与动作相同。如果抛出异常,则提供对部分结果的访问。结果数组中的null表示即使在重试

之后,对该操作的调用也会失败

您可以检查每个结果是否成功,因为您在问题中感到悲伤,除了批量操作在hbase中不是设计事务,行变异操作可能发生在不同的区域服务器上,因此不同的wal文件,因此它不能是事务性的,有一些开源项目试图通过检查结果和回滚成功的方式来实现这一点。