HBase: атомарная операция проверки строки не существует и создание

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

Мне просто нужно создать новую запись таблицы с совершенно случайным ключом. Предположим, я получил ключ с хорошей случайностью (почти случайно). Однако я не могу быть уверен на 100%, что еще ни одной строки не существует. Итак, что мне нужно сделать атомарно:

  • С проверкой ключа строки строки еще не существует.
  • Отклонить операцию, если строка существует.
  • Создать строку, если она не выходит.

Самой полезной информацией, которую я нашел по этой теме, является статья о блокировках строк HBase. Я считаю блокировку строк HBase подходящим решением, но я бы хотел сделать это лучше без явной блокировки строк.

  • ICV выглядит неподходящим, потому что я действительно хочу, чтобы ключ был случайным.
  • CAS было бы здорово, если бы они могли работать в состоянии "строка не существует", но, похоже, они не могут.
  • У явных блокировок строк есть недостатки, такие как проблемы разделения региона.

Может ли кто-нибудь добавить полезный совет? Предпочтительный API основан на Java, но на самом деле это скорее концепция, а не реализация.

1 ответ

Решение

"Достаточно хорошее" решение для этого случая оказалось основанным на checkAndPut() метод. То, что я намеревался сделать, это новая вставка строки с проверкой дублирования ключа, и для отдельных вставок идеально подходит решение:

  • HTable checkAndPut() метод может проверить, что определенный столбец не установлен (проверьте его для null значение).
  • Так как строки в любом случае содержат поле 'ID', которое является обязательным для всех объектов (вы можете использовать любое другое поле, которое вы всегда устанавливали для своего объекта), можно проверить, существует ли строка.
  • Put объект передан checkAndPut() должен содержать начальное состояние объекта с обязательным набором полей.

Что ж, для массовой вставки (что мне действительно нужно) она оказалась слишком медленной, поэтому я перешел на UUID, используемый в качестве ключей строки, без каких-либо проверок при вставке новой строки. Для меня это намного лучше. Единственное соображение в этом случае - действительно хороший генератор случайных чисел. Стандартная Java java.util.UUID класс содержит все, что мне нужно, в том числе и довольно медленный, но довольно сильный java.security.SecureRandom генератор.

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

Другие вопросы по тегам