2011-01-24 3 views
3

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

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

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

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

EDIT:

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

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

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

Можете ли вы рассказать, какие настройки JVM вы устанавливаете? – Pushkar

+0

Спасибо ... Смотрите мое редактирование выше. – knt

ответ

4

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

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

HTH

+0

Это произошло, когда я подключился к HBase с использованием Java-клиента, а также при передаче сценария в оболочку HBase. Сценарий оболочки - это всего лишь список команд put, один за другим. В обоих случаях (с использованием Java-клиента и с использованием сценария оболочки) я получаю ошибку после того же количества строк. – knt

+0

Чтобы продолжить мой более ранний комментарий, я сделал это изменение в Java-клиенте, и он действительно сработал ... На этот раз я смог добавить много строк. Тем не менее, я смущен, почему я до сих пор не могу вставить более 1600 строк через оболочку или что вызывает эту ошибку в первую очередь. Есть ли у вас какие-либо идеи? – knt

+0

В JAVA речь идет о распределении памяти для каждого потока в NVM и нехватке места для выделения другого потока. Я не очень хорош во внутренних JVM и т. Д., Поэтому я могу замаскировать некоторые детали. С оболочкой у меня меньше идеи, но она может делать то же самое, и пытаться создать новый поток для каждого put? * shrug * Я не играл с этим через это, поэтому я не уверен. – Nija

0

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

0

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

HTableInterface table = tablePool.getTable(tableName); 
// Do the work 
.... 
.... 
table.close()