使用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()
方法将transaction
和wal
作为参数。这些配置是否可以在批量中途失败的情况下回滚成功保存的行?
happybase会在这里抛出一个异常,这会让我记下行键并执行批量删除吗?
答案 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出现故障,则会丢失数据。