выполнение сканирования работает как Get в HBase

#hadoop #hbase

Вопрос:

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

Поэтому, если у меня есть ключи ниже и я хотел бы получить(12)

 row keys
12
123
21
22
 

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

Ответ №1:

Если направление сканирования задано по умолчанию (т. Е. не изменено), то обычно для меня работает установка начальной строки как 12, а конечной строки как 12x, где x-это какой-то завершающий специальный символ, который, как вы знаете, не встречается в вашем пространстве ключей строк и, вероятно, будет лексикографически позже после всех возможных символов в вашем диапазоне ключей строк. Например, я обычно использую » ~ » в качестве завершающего символа, но, возможно, для вас лучше подойдет что-то другое.

Кроме того, у сканирования есть .setLimit(int) параметр, который может ограничить ваше сканирование только 1. Вы можете использовать оба элемента вместе. Однако я не уверен, почему это должно работать быстрее, чем Get.

Если вы чувствуете, что ваши проверки работают быстрее, чем gets, возможно, это как-то связано с конфигурацией очереди вызовов в вашем кластере. Например, возможно, ваш кластер настроен на выделение большего количества обработчиков для сканирования, а не для получения. Это не поведение по умолчанию, но возможно, кто-то настроил его таким образом, и если ваш кластер очень занят, возможно, именно поэтому вы так себя чувствуете.

Комментарии:

1. Не уверен, что вы подразумеваете под разной квотой для сканирования или получения, я знаю hbase.regionserver.handler.count, который можно использовать для установки количества потоков для каждого регионального сервера. Вы имеете в виду этот параметр?

2. Этот параметр определяет, сколько обработчиков у вас есть в целом. Помимо этого, существует параметр hbase.ipc.server.callqueue.read.ratio, который определяет, сколько из этих обработчиков предназначено для запросов на чтение (сканирует и получает). И оттуда есть еще один параметр hbase.ipc.server.callqueue.scan.ratio, который определяет, какая доля обработчиков чтения специально предназначена для сканирования (а не для получения). Как я уже упоминал, эти параметры не должны быть там, но если вы чувствуете, что ваши сканирования выполняются намного быстрее, чем Gets, может быть, именно поэтому?