Могу ли я выполнить слияние ячеек в hbase?

Предположим, что у меня есть столбец, который обновляется постепенно, кроме перезаписи (например, побитовый целочисленный флаг или столбец суммы). Например (при условии только 1 версии):

Существующая ячейка: [key: 'k1', f1: sum: 100]
Новая ячейка: [key: 'k1', f1: sum: 200]

Затем я хочу обновить данные ячейки следующим образом: sum = 100 + 200 = 300. Получение окончательной записи:
[key: 'k1', f1: sum: 300]

Здесь я хочу ОБЪЕДИНЯТЬ новую ячейку со старой с тем же ключом. Как я могу этого добиться? Прямая установка просто перезапишет старую ячейку. (Опять же поддерживается только одна версия).

Я придумываю несколько идей, но они не кажутся удовлетворительными:

1> На стороне клиента сначала получите старое значение, затем добавьте сумму к текущему объекту размещения.

2> Используйте сопроцессор. В RegionObserver.prePut я получаю, добавляю и изменяю последний объект put. Это подталкивает вычисления к стороне сервера, но по-прежнему требует дополнительного запроса (get) (что может быть дорогостоящим).

Кроме того, даже вышеперечисленное работает в сценарии запросов в реальном времени, но как насчет слияния данных массовой загрузки?

Я просматривал документы довольно долго, но пока не могу найти ключ к разгадке. Я буду очень признателен, если вы поделитесь некоторыми идеями по этому поводу.

Я использую hbase-1.2.6. Спасибо!


person user1206899    schedule 08.11.2017    source источник


Ответы (1)


Если я правильно понимаю ваш вариант использования и значения будут длинными целыми числами, тогда я думаю, что операция приращения HBase должна работать для вас. Посмотрите на HBase 1.2.6 javadoc для Increment для получения подробной информации.

Если это не то арифметическое приращение, которое вам нужно, HBase также имеет Добавить, которую можно использовать для атомарного добавления дополнительных данных в существующую ячейку.

Обратите внимание, что в javacdoc упоминается, что приращения и добавления гарантируют атомарность для записи, но не для чтения, что неверно. На самом деле они действительно гарантируют атомарность и для чтения (начиная с HBase 0.95), и это было исправлено в документации в более поздних выпусках.

Кроме того, операции Increment и Append не делают лишнего Get rpc. Они работают, беря блокировку строки на стороне сервера, а затем выполняя чтение с последующей записью на сервере с той же блокировкой.

person Ashu Pachauri    schedule 09.11.2017
comment
В моем случае новое значение ячейки каким-то образом зависит от существующей ячейки и может быть более сложным, чем простое добавление или добавление. Например, у меня есть старое значение ячейки, которое является целым числом K, и я хочу обновить его до K_new = K ^ K ', где K' - это некоторый инкрементный вид значения из производства. Я нашел, возможно, связанный api: Table :: checkAndPut ( hbase.apache.org/devapidocs/org/apache/hadoop/hbase/client/ < / а>). Но я не знаю, как им пользоваться. Как вы думаете, это может помочь? Спасибо. - person user1206899; 10.11.2017
comment
Я думаю, что приведенный выше api помогает достичь атомарной операции. В конце концов, я должен сделать гет, за которым следует пут в любом смысле. - person user1206899; 10.11.2017