HBase的HappyBase和Atomic批量插入

时间:2015-06-01 03:12:17

标签: python hbase happybase

使用Python中的HBase HappyBase API,可以通过以下方式执行批量插入:

import happybase
connection = happybase.Connection()
table = connection.table('table-name')
batch = table.batch()
# put several rows to this batch via batch.put()
batch.send()

如果此批次失败中途会发生什么?已保存的行是否仍然保存,哪些行未保存?

我在HappyBase github中注意到table.batch()方法将transactionwal作为参数。这些配置是否可以在批量中途失败的情况下回滚成功保存的行?

happybase会在这里抛出一个异常,这会让我记下行键并执行批量删除吗?

2 个答案:

答案 0 :(得分:2)

您是否遵循了Happybase文档中有关批量突变的教程?看起来你在这里混淆了一些东西。 https://happybase.readthedocs.org/en/latest/user.html#performing-batch-mutations

批量纯粹是一种性能优化:它们避免了对存储/删除的每一行的Thrift服务器的往返,这可能会导致显着的加速。

上下文管理器行为(with块),如上面链接的用户指南中的大量示例所解释的,是纯粹的客户端便利API,使应用程序代码更易于编写和推理。如果with块成功完成,则一次性将所有突变发送到服务器。

然而......那只是快乐的道路。如果从with块的某处引发了一些Python异常,该怎么办? transaction标志发挥作用的地方:如果True,根本没有数据发送到服务器,如果False,则无论如何都要刷新任何待处理数据。哪种行为更受欢迎取决于您的使用案例。

答案 1 :(得分:1)

我不知道python或happybase。据我所知,事务在库中实现为后备策略。由于Hbase除了行内突变之外没有任何事务支持,因此库只能通过回滚它刚刚执行的操作来模拟事务。我认为代码中的Batch类就是这样做的。

    The `transaction` argument specifies whether the returned
    :py:class:`Batch` instance should act in a transaction-like manner when
    used as context manager in a ``with`` block of code. The `transaction`
    flag cannot be used in combination with `batch_size`.
    The `wal` argument determines whether mutations should be
    written to the HBase Write Ahead Log (WAL). This flag can only
    be used with recent HBase versions. If specified, it provides
    a default for all the put and delete operations on this batch.

https://github.com/wbolster/happybase/blob/master/happybase/table.py第460-480行

wal也是一种性能参数。如果操作没有写入WAL,速度会更快。来自hbase doc;

  

关闭此功能意味着RegionServer不会将Put写入Write Ahead Log,只会写入memstore,但结果是如果RegionServer出现故障,则会丢失数据。

http://hbase.apache.org/0.94/book/perf.writing.html第11.7.5节