HBase checkAndPut уточнение атомарности - PullRequest
3 голосов
/ 03 октября 2019

Я просто хочу пояснить, как работает HBASE checkAndPut, основываясь на документации HBASE,

Атомно проверяет, соответствует ли значение строки / семейства / квалификатора ожидаемому значению. Если это так, он добавляет пут. Если переданное значение равно нулю, проверка выполняется на отсутствие столбца (т. Е. Не существует)

Когда он говорит «Атомно», я предполагаю, что он заблокирует и изолирует строку и выполнитСравнение перед тем, как сделать, чтобы предотвратить любую другую операцию для этой строки. Кроме того, checkAndPut работает для проверки несуществования, если ключ строки не существует, что он будет изолировать / заблокировать?

У меня есть 2 теории на это:

  1. Либо HBASE checkAndPut не изолирует какую-либо строку, если она не существует, означает ли это, что при выполнении checkAnPut для той же строки, которая не существует одновременно, обе будут успешно обработаны?

  2. Это изоляция по ключу строки?

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

Или HBASE checkAndPut не идеально подходит для проверки существования строки? Может быть, он идеально подходит для использования только при наличии строки и проверке только семейства / квалификатора? Потому что JAVA API выглядит следующим образом.

1 Ответ

1 голос
/ 08 октября 2019

Прежде чем пытаться понять, как checkAndPut ведет себя в случае несуществующей строки, вы должны сначала понять, как mutations работает в HBase.

Мутации в HBase

Мутацияв HBase - любая операция записи, например, Put, Delete и т. д. Поскольку HBase является строго согласованной системой и обеспечивает гарантии атомарности для одной строки (по семействам столбцов), все мутации для конкретной строки должны проходить черезтот же сервер. Вы должны прочитать больше о концепции регионов и серверов регионов в документации по HBase, чтобы понять, как HBase делит ответственность за обслуживание неперекрывающихся разделов пространства ключей строки на нескольких серверах.

Всякий раз, когда сервер региона получаетмутация для определенной строки, он получает в памяти write lock на значение этого ключа строки. По сути это означает четыре вещи:

  1. Поскольку одна строка может быть записана только одним региональным сервером, никогда не может быть более одного сервера, пытающегося выполнить запись и получить блокировку для одной и той же строки.
  2. Поскольку блокировка находится в памяти, если сервер падает сразу после получения блокировки, блокировка автоматически снимается. В этом случае ответственность региона будет постепенно перемещаться на новый сервер, но ваша операция не будет выполнена (не считая автоматических повторных попыток на клиенте).
  3. Поскольку блокировка записи относится ко всей строке, происходит переход к столбцу x приведет к тому, что операции со столбцом y той же строки будут заблокированы.
  4. Поскольку блокировка выполняется для значения ключа строки (регион-сервер поддерживает список заблокированных в данный момент строк в памяти),строка не обязательно должна существовать заранее.

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

...