Производительность сканирования HBase

Я выполняю сканирование диапазона, которое дает мне 500 тыс. Записей. Если я установлю scan.setCaching(100000) это заняло менее одной секунды, но если scan.setCaching(100000) не установлено, это заняло почти 38 сек.

Если я установлю scan.setBlockCache(false) а также scan.setCaching(100000) что случится? Будут ли кэшироваться строки или нет?

Я сбрасываю кэш ОС после первого сканирования, но нет изменений во времени сканирования записей. Зачем?

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

2 ответа

Scan.setCaching это неправильно. Это действительно должно называться что-то вроде Scan.setPrefetch, setCaching фактически указывает, сколько строк будет передано за RPC на сервер регионов. Если вы используете setCaching(1) затем каждый раз, когда вы звоните next() Вы оплачиваете стоимость поездки в оба конца на региональный сервер. Недостатком установки большего значения является то, что вы платите за дополнительную память в клиенте, и, возможно, вы выбираете строки, которые вы не будете использовать, например, если вы прекратите сканирование после достижения определенного количества строк или после того, как вы нашли конкретное значение.

Scan.setBlockCache означает нечто совершенно иное, как указал Чандра. Он в основном инструктирует регион-сервер не извлекать никакие данные из этого сканирования в HBase BlockCache, который является отдельным пулом памяти из MemStore. Обратите внимание, что MemStores используются для записи, а BlockCache - для чтения, и эти две части памяти полностью разделены. В настоящее время HBase не использует BlockCache в качестве кэша обратной записи. Вы можете контролировать размер кеша блоков с помощью hfile.block.cache.size настройка конфигурации в hbase-site.xml, Точно так же вы можете контролировать общий размер пула MemStore через hbase.regionserver.global.memstore.size установка.

Вы можете использовать setBlockCache(false) если вы выполняете полное сканирование таблицы и не хотите сбрасывать текущий рабочий набор в кеш блоков. В противном случае, если вы сканируете данные, которые часто используются, было бы лучше оставить setBlockCache в одиночестве.

Hbase имеет 2 типа структур кеша - memory store а также block cache,
Хранилище памяти реализовано как MemStore, а кеш, который вы используете для чтения, является блочным кешем.
Когда блок данных читается из HDFS, он кэшируется в BlockCache. Последующие чтения соседних данных просто обслуживаются из BlockCache.
Таким образом, когда вы вручную устанавливаете scan.set Block Cache(false), он прекращает кэширование строк, которые он читает из hdfs.
scan.set-caching (100000) - это оптимизация на стороне клиента, связанная со сканерами. Так что все равно будет работать без изменений

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