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 будет удалена из-за рисков безопасности / других рисков, связанных с ее использованием.