我遇到了Hbase的以下问题。
我有一个脚本启动HBase shell并将多行插入到具有单列的表中。我尝试插入10,000行,但在大约1,700之后我得到了可怕的“java.lang.OutOfMemoryError:无法创建新的本机线程”错误。我已经尝试将Java堆大小从1000mb默认更改为1800mb,但这不允许我插入超过1700左右的行。
但是,我注意到我可以插入1000行,退出shell,重新启动shell,再将1000个插入同一个表中,再次退出,依此类推。我对JVM的理解还不太清楚,为什么它允许我在几个会话中执行此操作,但不允许我在同一会话中批量插入。
有人可以向我解释这里发生了什么,以及我可能会怎么做?
编辑:
我现在使用64位机器,red hat linux 5,使用Java 1.6。我给HBase一个20gb的堆大小(我总共有~32演出)。 对于堆栈大小,我给8mb。我相信64位的默认值是2mb;使用2mb我得到了同样的错误,并将它增加到8mb没有任何帮助(我只能插入相同数量的行而不管堆栈大小,~1700)。
我已经读过,减小堆大小可能会使这个错误消失,但这也无济于事。下面是我正在设置的jvm选项(除了堆栈大小外,一切都是默认的)。
HBASE_OPTS="$HBASE_OPTS -ea -Xss8M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"
答案 0 :(得分:4)
昨天我遇到了这个错误。在我的情况下发生的事情是我创建了很多HTable
的实例,当我在记录上使用put
时创建了太多的线程。 (我使用的是mapper并在map
函数中创建)
我要检查你的HBase连接是否被大量创建(在循环或map
函数内。如果发生这种情况,那么移动它以实例化更少的HBase连接(我使用过{ {1}})可以解决问题。
它解决了我的问题。
HTH
答案 1 :(得分:0)
当我使用HTablePool
实例获取HTableInterface
实例时遇到此错误,但在使用后我忘记调用close()
方法。
答案 2 :(得分:0)
我也遇到了同样的问题,正如上面kosii所解释的那样,根本原因是没有关闭我在使用后从HTablePool获得的HTableInterface实例。
HTableInterface table = tablePool.getTable(tableName);
// Do the work
....
....
table.close()