2012-01-19 3 views
1

Я использую HBase для хранения данных временных рядов. Используя предложение в книге O'Reilly HBase, я использую ключ строки, который является меткой времени с помощью соленого префикса. Чтобы запросить эти данные, я создаю несколько потоков, которые осуществляют проверку по диапазону временных меток, при этом каждый поток обрабатывает конкретный префикс. Затем результаты помещаются в параллельный хэш-файл.Многопоточное сканирование HBase действительно медленное

Неисправность возникает, когда потоки выполняют проверку. Запрос, который обычно занимает приблизительно 5600 мс, когда он выполняется последовательно, занимает от 40000 до 80000 мс, когда генерируется 6 нитей (соответствует 6 солям/регионам серверов).

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

, в частности, я заметил значительное замедляются, когда я ударил эту часть моего кода:

for(Result res : rowScanner){ 
//add Result To HashMap 

Через протоколирования я заметил, что каждый раз через условную петли я испытал задержки многих секунд. Эти задержки не возникают, если я принудительно запускаю потоки.

Я предполагаю, что существует некоторая проблема с блокировкой ресурсов, но я просто не вижу ее.

+0

Я также заметил, что я использую OpenJDK, а не Oracle JDK, который поставляется вместе с моим программным пакетом HBase (Cloudera).
Я не уверен, что это может быть проблемой, но я слышал, что могут возникнуть проблемы с проблемами потоковой передачи между разными JDK. – shadonar

+0

Я новичок в HBase, но каковы настройки Xms/Xmx для JVM сервера HBase? Возможно, HBase вынуждена работать во многих прогонах GC, которые замедляют работу. – Behrang

+0

Я понял, что моя установка HBase хранит эти данные только на одном сервере региона. По-видимому, размер блока слишком велик для количества данных, которые у меня были в HBase. Я изменил размер блока и поместил больше данных, чтобы убедиться, что есть несколько региональных серверов и множество данных.Это привело к тому, что потоки возвращались быстрее, чем предыдущие последовательные прогоны, но это не было связано с некоторым количеством числа потоков. Он вернулся с 6 потоками, примерно в 3400 мс. Благодарю вас за помощь. Это были отличные предложения, и я продолжу использовать их для увеличения своей производительности. – shadonar

ответ

4

Убедитесь, что вы устанавливаете и Caching на объекты сканирования (объект, который используется для создания сканера). Они контролируют, сколько строк передается по сети одновременно, и сколько их хранятся в памяти для быстрого извлечения на самом сервере RegionServer. По умолчанию они слишком низки, чтобы быть эффективными. BatchSize, в частности, значительно увеличит вашу производительность.

EDIT: на основе комментариев звучит так, будто вы можете переключаться либо на сервере, либо на клиенте, либо на сервере RegionServer может не хватать места в блоке BlockCache для удовлетворения ваших сканеров. Сколько кучи вы предоставили RegionServer? Вы проверили, не происходит ли обмен данными? См. How to find out which processes are swapping in linux?.

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

+0

Я попытался использовать BatchSize, и это привело к фактическому потере некоторых данных, которые я запрашивал. Я заметил очень минимальные изменения при изменении кеширования объектов сканирования. Я попробую их снова и посмотрю, было ли что-то, чего я не видел. только что протестировали снова с измененным BatchSize, и я не потерял никаких данных, но это заняло около 99 тыс. Мс. не точно увеличение производительности. – shadonar

+0

Не устанавливайте их слишком высоко - 100 или около того. Если вы установите их слишком высоко, ваши сканеры могут отключиться на сервере регионов, пока ваш клиент обрабатывает текущую партию. –

+0

Я установил BatchSize на 1000 и Caching до 200, и это были результаты, которые я получил. Я тестирую снова с BatchSize, установленным до 100 или около того, и посмотрим, поможет ли это кому-либо. ..... Кэш @ 200 с отключенной периодичностью = 79 тыс. Мс кеш @ 200 с пакетной передачей @ 1000 = 99,9 тыс. Мс кеш @ 200 с пакетом @ 100 = 82,6 тыс. Мс – shadonar

1

Рассматривали ли вы использование MapReduce, возможно, только для того, чтобы легко разделить сканирование по регионам серверов? Это проще, чем беспокоиться о потоковой обработке и синхронизации в клиентских библиотеках HBase. Класс Result не является потокобезопасным. TableMapReduceUtil упрощает настройку рабочих мест.

Смежные вопросы