Hbaseで次の問題が発生しています。
HBaseシェルを起動し、単一の列を持つテーブルに多くの行を挿入するスクリプトがあります。10,000行を挿入しようとしましたが、約1,700行後に、恐ろしい「java.lang.OutOfMemoryError:新しいネイティブスレッドを作成できません」というエラーが発生します。Javaヒープサイズをデフォルトの1000mbから1800mbに変更しようとしましたが、これでは1700程度を超える行を挿入できません。
ただし、1000行を挿入し、シェルを終了し、シェルを再起動し、同じテーブルにさらに1000を挿入し、再度終了するなどのことができることに気付きました。JVMについて十分に理解していないため、複数のセッションでこれを実行できるのに、同じセッションでバッチ挿入を実行できない理由を理解できません。
誰かが私にここで何が起こっているのか、そして私がそれについて何をするかもしれないのか説明してもらえますか?
編集:
現在、64ビットマシンのRed HatLinux5とJava1.6を使用しています。HBaseに20GBのヒープサイズを与えています(合計で最大32ギガのメモリがあります)。スタックサイズについては、8MBを与えています。64ビットのデフォルトは2MBだと思います。2mbの場合、これと同じエラーが発生し、8mbに増やしてもまったく役に立ちませんでした(スタックサイズに関係なく、同じ量の行しか挿入できませんでした、〜1700)。
ヒープサイズを小さくするとこのエラーがなくなる可能性があることを読みましたが、それも役に立ちませんでした。以下は私が設定しているjvmオプションです(スタックサイズを除いてすべてがデフォルトです)。
HBASE_OPTS="$HBASE_OPTS -ea -Xss8M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"