2011-12-15 4 views
2

У меня есть небольшая проблема - я не могу понять, как создать транзакцию (или ее аналог) в HBase. Например, есть две таблицы, и я хочу вставить значение в первом и обновить значение во второй таблице. Я обнаружил, что HTable имеет метод:Аналог транзакции в HBase

void batch(List<Row> actions, Object[] results) 
//Method that does a batch call on Deletes, Gets and Puts. 

Но он работает только с одной таблицей. Погуглить, я нашел класс MultiAction:

Контейнер для действий (т.е. получить, удалить или Пут), которые сгруппированы по regionName. Предназначен для использования с HConnectionManager.processBatch()

Это то, что я ищу? Если да, то я не могу понять, что такое region. Спасибо за любую помощь.

ответ

3

HBase не поддерживает транзакции. Хотя у вас есть что-то вокруг атомарности на одной таблице, вы имеете дело с транзакцией, если вам нужно обновить более одного. Сделки означает 4 вещи, которые идут по аббревиатуре ACID. в двух словах

  • Атоматичность - изменения в транзакции происходят вместе («все или ничего»).
  • Консистенции - государство должно оставаться в силе
  • Изоляции - операция за пределами сделки не может видеть половина изменения (промежуточные несогласованные состояния)
  • Долговечность - изменения должны сохраняющиеся

Вы должны были бы изменить Hbase код чтобы получить изоляцию, но если вы можете расслабиться, это требование, вы можете реализовать координатор транзакций, который примерно сделал бы что-то вроде

  • сохранить то, что необходимо сделать на трассе nsaction в специальной таблице (журнал транзакции)
  • выполнить первое изменение
  • выполнить второе изменение
  • убедитесь, что шаги, где сделаны и обозначающие сделки завершенными
  • при восстановлении идет в журнал транзакций и полный/откат изменения

Обратите внимание, что, поскольку у вас нет изоляции иногда откат это не вариант, так что вы должны были бы реализовать логику компенсации (также посмотрите на saga pattern)

1

Есть несколько проектов, направленных на предоставление транзакционного слоя поверх HBase, например Omid, на который я вношу свой вклад.