2016-03-25 7 views
0

Я использую apache hbase (версия 1.0.0) и phoenix (версия 4.6), развернутые через cloudera. Поскольку мои агрегации с группой по запросу медленны, я хочу попробовать отключить кеш-блок для конкретной таблицы hbase. Я попробовал несколько подходов, но не смог добиться успеха. Я проверяю, включен ли кеш блока в оболочку hbase - описать команду my_table.Отключить блокирующий блок HBase

  1. Set 'hfile.block.cache.size' свойство от Cloudera консоли 0
  2. alter 'myTable', CONFIGURATION => {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}

Даже после двух вышеупомянутых шагов, я получаю BLOCKCACHE => 'истинно' в описательной командный выход

COLUMN FAMILIES DESCRIPTION 
{NAME => '0', DATA_BLOCK_ENCODING => 'FAST_DIFF', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => 'NONE', VERSIONS => '1', MIN_VERSIONS => '0', TTL => 'FOREVER', 
KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 

Что может быть не так? Какие-либо предложения?

спасибо.

ответ

0

Минимум phoenix.query.maxGlobalMemoryPercentage и phoenix.query.maxGlobalMemorySize управляют максимальной памятью для промежуточных результатов при группировке по группам. Изменение этого ограничения (по умолчанию 15%) может улучшить производительность агрегации.

+0

Теоретически, имеет ли смысл блокировать кеш блока для агрегации и группировать по запросам? Предполагая, что это приведет к полному сканированию таблицы, я думаю, что это будет препятствовать производительности, если блок-кеш включен. Рассмотрим запрос на свертывание, например: SELECT SUM (UNIT_SOLD), SUM (TOTAL_SALES) FROM ГРУППЫ ОПЕРАЦИЙ ПО СТРАНАМ; Как вы думаете? –

0

Теперь я понимаю проблему более четко. Phoenix реализует сопроцессоры в HBase для параллельного выполнения запросов на серверах HBase.

Если план запроса состоит только из одного сканирования таблицы, может не понадобиться кэшировать (maxGlobalMemory кэш). Но Phoenix в настоящее время не поддерживает ROLLUP. Для GROUP BY, Phoenix будет хранить промежуточную карту (возвращенную сопроцессорами) в памяти или разбрызгиваться на диск (поведение, определяемое phoenix.query.maxGlobalMemory), прежде чем получить окончательный результат. Лучше иметь его в памяти. Параметры кеша блока HBase вступают в силу, когда сопроцессор выполняется на каждом узле HBase (поскольку вы только ожидаете, что прочитаете эту таблицу один раз, имеет смысл отключить кеш-память для этих семейств столбцов, чтобы уменьшить накладные расходы на сборку мусора и выселение полезных блоков).

Таким образом, две настройки являются взаимодополняющими. Вы можете отключить кеш блока HBase при настройке кеша maxGlobalMemory.

Что касается настройки не вступают в силу, http://hbase.apache.org/book.html#config.files

В настоящее время изменения здесь потребуется перезагрузка кластера для HBase заметить изменения.

+0

Я нашел способ отключить кеш. Выполняя запрос alter table в phoenix, я смог это сделать. Я попробовал параметр maxGlobalMemory, но это не повлияло на тайминги запросов. Btw, вы упоминаете о ROLLUP, насколько это возможно для поддержки предложения ROLLUP в сравнении с этим запросом «SELECT SUM (UNIT_CNT_SOLD), SUM (TOTAL_SALES) FROM ГРУППЫ ОПЕРАЦИЙ ПО T_COUNTRY; , Этот запрос ускоряет продажи по странам? –

+0

Я неправильно понял ваше раннее упоминание о ROLLUP. Могут быть запросы, которые генерируют один и тот же запрос/план выполнения как оператор ROLLUP, но Phoenix не поддерживает ключевое слово ROLLUP в запросах, о чем я имел в виду.Но я согласен, что отключение кэша блоков кажется уместным. Улучшило ли производительность в этом случае? – kliew