2015-06-01 4 views
1

С API HappyBase для HBase в Python, пакетный вставка может быть выполнена следующим образом:HappyBase и Atomic Пакетные Вставки для HBase

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

Что произошло бы в том случае, эта партия не удалось половину пути? Сохранялись ли сохраненные строки, а те, которые не были сохранены?

Я отметил в github HappyBase, что метод table.batch() принимает transaction и wal в качестве параметров. Могут ли они быть настроены таким образом, чтобы откат успешно сохраненных строк в случае сбоя партии на полпути?

Будет ли happybase выдавать исключение здесь, что позволит мне обратить внимание на клавиши строки и выполнить пакетное удаление?

ответ

1

ли вы следовать учебнику о пакетных мутациях в документации Happybase? Похоже, вы смешиваете здесь несколько вещей. https://happybase.readthedocs.org/en/latest/user.html#performing-batch-mutations

Партии - это просто оптимизация производительности: они избегают кругового отключения на сервере Thrift для каждой строки, которая сохраняется/удаляется, что может привести к значительному ускорению.

Поведение менеджера контекста (блок with), как описано в многочисленных примерах в руководстве пользователя, приведенном выше, представляет собой чисто удобный API-интерфейс на стороне клиента, который делает код приложения более удобным для написания и обоснования. Если блок with успешно завершен, все мутации отправляются на сервер за один раз.

Однако ... это только счастливый путь. Что делать, если какое-то исключение Python было поднято где-то из блока with? Вот где флаг transaction вступает в игру: если True, на сервере не отправляются никакие данные, если False, любые отложенные данные покраснели в любом случае. Какое поведение предпочтительнее, сильно зависит от вашего варианта использования.

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. Из hbase doc;

Выключая означает, что RegionServer не запишет, поставленному на упреждающее Log, только в memstore, ОДНАКО следствием является то, что если произойдет сбой RegionServer будет потеря данных.

http://hbase.apache.org/0.94/book/perf.writing.html раздел 11.7.5

Смежные вопросы