3

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"
4

3 に答える 3

4

昨日このエラーが発生しました。私の場合に起こっていたのは、レコードでonHTableを使用しているときに、非常に多くのスレッドを作成するインスタンスを多数作成していたことです。put(マッパーを使用してmap関数内で作成していました)

HBaseへの接続が大量に作成されているかどうかを確認します(ループまたはmap関数内。それが発生している場合は、HBase(私が使用しHTableた)への接続を少なくするためにHBaseを移動すると、問題が解決する可能性があります。これで解決しました。 。

HTH

于 2011-02-02T18:24:35.290 に答える
0

HTablePoolインスタンスを使用してインスタンスを取得しているときにこのエラーが発生しましたが、使用後にメソッドHTableInterfaceを呼び出すのを忘れています。close()

于 2013-03-12T16:16:43.630 に答える
0

私も同じ問題に遭遇し、上記の kosii で説明されているように、根本的な原因は、使用後に HTablePool から取得した HTableInterface インスタンスを閉じていませんでした。

HTableInterface table = tablePool.getTable(tableName);
// Do the work
....
....
table.close()
于 2013-12-04T17:55:30.760 に答える