HBase java.lang.OutOfMemoryError - PullRequest
       5

HBase java.lang.OutOfMemoryError

3 голосов
/ 24 января 2011

У меня возникла следующая проблема с Hbase.

У меня есть скрипт, который запускает оболочку HBase и вставляет много строк в таблицу с одним столбцом. Я попытался вставить 10000 строк, но примерно через 1700 я получаю страшную ошибку «java.lang.OutOfMemoryError: не удалось создать новый собственный поток». Я попытался изменить размер кучи Java с 1000 МБ по умолчанию до 1800 МБ, но это не позволяет мне вставлять более 1700 строк или около того.

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

Может кто-нибудь объяснить мне, что здесь происходит, и что я могу с этим поделать?

EDIT:

Сейчас я использую 64-битную машину Red Hat Linux 5 с Java 1.6. Я даю HBase размер кучи 20 Гб (у меня всего ~ 32 гигабайта памяти). Для размера стека я даю 8 МБ. Я полагаю, что значение по умолчанию для 64-битной системы составляет 2 МБ; с 2 МБ я получил эту же ошибку, и увеличение до 8 МБ вообще не помогло (я мог только вставить одинаковое количество строк независимо от размера стека, ~ 1700).

Я читал, что уменьшение размера кучи может устранить эту ошибку, но это тоже не помогло. Ниже приведены параметры jvm, которые я устанавливаю (все по умолчанию, кроме размера стека).

HBASE_OPTS="$HBASE_OPTS -ea -Xss8M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Я столкнулся с этой ошибкой вчера.В моем случае происходило то, что я создавал множество экземпляров HTable, что создавало слишком много потоков, когда я использовал put в записи.(Я использовал маппер и создавал его внутри функции map)

Я бы проверил, часто ли создается ваше соединение с HBase (внутри цикла или функции map.что происходит, затем перемещение его для создания меньшего количества подключений к HBase (я использовал HTable) может решить проблему. Это решило мою проблему.

HTH

0 голосов
/ 04 декабря 2013

Я также сталкивался с той же проблемой, и, как объяснено выше в kosii, основной причиной не было закрытие экземпляра HTableInterface, который я получил от HTablePool после использования.

HTableInterface table = tablePool.getTable(tableName);
// Do the work
....
....
table.close()
0 голосов
/ 12 марта 2013

Я столкнулся с этой ошибкой, когда использовал экземпляр HTablePool для получения экземпляров HTableInterface, но после использования я забыл вызвать для него метод close().

...