Прежде чем пытаться понять, как checkAndPut
ведет себя в случае несуществующей строки, вы должны сначала понять, как mutations
работает в HBase.
Мутации в HBase
Мутацияв HBase - любая операция записи, например, Put
, Delete
и т. д. Поскольку HBase является строго согласованной системой и обеспечивает гарантии атомарности для одной строки (по семействам столбцов), все мутации для конкретной строки должны проходить черезтот же сервер. Вы должны прочитать больше о концепции регионов и серверов регионов в документации по HBase, чтобы понять, как HBase делит ответственность за обслуживание неперекрывающихся разделов пространства ключей строки на нескольких серверах.
Всякий раз, когда сервер региона получаетмутация для определенной строки, он получает в памяти write lock
на значение этого ключа строки. По сути это означает четыре вещи:
- Поскольку одна строка может быть записана только одним региональным сервером, никогда не может быть более одного сервера, пытающегося выполнить запись и получить блокировку для одной и той же строки.
- Поскольку блокировка находится в памяти, если сервер падает сразу после получения блокировки, блокировка автоматически снимается. В этом случае ответственность региона будет постепенно перемещаться на новый сервер, но ваша операция не будет выполнена (не считая автоматических повторных попыток на клиенте).
- Поскольку блокировка записи относится ко всей строке, происходит переход к столбцу
x
приведет к тому, что операции со столбцом y
той же строки будут заблокированы. - Поскольку блокировка выполняется для значения ключа строки (регион-сервер поддерживает список заблокированных в данный момент строк в памяти),строка не обязательно должна существовать заранее.
CheckAndPut
ничем не отличается от обычного Put
в плане семантики блокировки. Единственное отличие состоит в том, что он выполняет дополнительную операцию Get
после блокировки ключа строки, чтобы проверить существующее значение столбца для этого ключа строки (он может быть нулевым, ключ строки еще может вообще не существовать). По этой же причине ключ строки, для которого был сгенерирован Put
, должен совпадать с ключом строки, для которого сгенерирована операция Get
. В противном случае семантика блокировки в памяти не сможет обеспечить гарантии согласованности. Это хорошо работает с другими ACID-гарантиями HBase, которые также предоставляются только на уровне одной строки.