HBase 批处理操作是原子的吗?
Are HBase Batch Operations Atomic?
// 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);
此代码片段是否可能导致至少一个(但不是全部)put 无法保存到 HBase?换句话说,batch
是否保证以原子方式发生,其中要么保存所有 puts
,要么全部保存 none?
如果batch
不能保证这一点,我们如何确定哪些 put 成功,哪些失败?或者,我们是否可以至少识别出某些失败的地方,这会告诉我们去删除我们试图保存的所有行以便将它们回滚?
当我将结果转换为 Result
并打印出来时,它 returns keyvalues=NONE
,但我可以看到我的 puts 成功了。
来自 hbase 客户端 api 文档:
public void batch(List<? extends Row> actions, Object[] results)
操作 Get、Put、Delete、Increment、Append 列表
objectsresults 空对象[],与操作大小相同。提供对部分结果的访问,以防抛出异常。结果数组中的 null 表示对该操作的调用失败,即使在重试后也是如此
你可以检查每个结果是否成功,因为你对你的问题感到遗憾,除了批处理操作在设计上不是 hbase 中的事务性之外,行变异操作可能发生在不同的区域服务器上,因此不同的 wal 文件,所以它不能是事务性的,有一些开源项目试图通过检查结果和回滚成功的结果来实现这一点。
// 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);
此代码片段是否可能导致至少一个(但不是全部)put 无法保存到 HBase?换句话说,batch
是否保证以原子方式发生,其中要么保存所有 puts
,要么全部保存 none?
如果batch
不能保证这一点,我们如何确定哪些 put 成功,哪些失败?或者,我们是否可以至少识别出某些失败的地方,这会告诉我们去删除我们试图保存的所有行以便将它们回滚?
当我将结果转换为 Result
并打印出来时,它 returns keyvalues=NONE
,但我可以看到我的 puts 成功了。
来自 hbase 客户端 api 文档:
public void batch(List<? extends Row> actions, Object[] results)
操作 Get、Put、Delete、Increment、Append 列表
objectsresults 空对象[],与操作大小相同。提供对部分结果的访问,以防抛出异常。结果数组中的 null 表示对该操作的调用失败,即使在重试后也是如此
你可以检查每个结果是否成功,因为你对你的问题感到遗憾,除了批处理操作在设计上不是 hbase 中的事务性之外,行变异操作可能发生在不同的区域服务器上,因此不同的 wal 文件,所以它不能是事务性的,有一些开源项目试图通过检查结果和回滚成功的结果来实现这一点。