HBase java.lang.OutOfMemoryError

HBase java.lang.OutOfMemoryError,java,jvm,hadoop,hbase,Java,Jvm,Hadoop,Hbase,我对Hbase有以下问题 我有一个脚本,它启动HBase shell并将许多行插入到一个具有单个列的表中。我尝试插入10000行,但大约1700行之后,我遇到了可怕的“java.lang.OutOfMemoryError:无法创建新的本机线程”错误。我尝试将Java堆大小从1000mb默认值更改为1800mb,但这不允许插入超过1700行的数据 但是,我注意到我可以插入1000行、退出shell、重新启动shell、在同一个表中插入1000行、再次退出等等。我对JVM的了解还不够,无法理解为什么

我对Hbase有以下问题

我有一个脚本,它启动HBase shell并将许多行插入到一个具有单个列的表中。我尝试插入10000行,但大约1700行之后,我遇到了可怕的“java.lang.OutOfMemoryError:无法创建新的本机线程”错误。我尝试将Java堆大小从1000mb默认值更改为1800mb,但这不允许插入超过1700行的数据

但是,我注意到我可以插入1000行、退出shell、重新启动shell、在同一个表中插入1000行、再次退出等等。我对JVM的了解还不够,无法理解为什么它允许我在几个会话中执行此操作,但不允许我在同一会话中批量插入

有人能给我解释一下这里发生了什么事,我会怎么做吗

编辑:

我现在使用64位机器,red hat linux 5和Java 1.6。我给HBase一个20gb的heapsize(我总共有~32 gigs内存)。 对于堆栈大小,我给出8mb。我相信64位的默认值是2mb;对于2mb,我得到了同样的错误,将其增加到8mb根本没有帮助(我只能插入相同数量的行,而不管堆栈大小,~1700)

我已经读到减小堆大小可以消除这个错误,但这也没有帮助。下面是我正在设置的jvm选项(除了堆栈大小之外,所有内容都是默认的)


我昨天遇到了这个错误。在我的例子中,我创建了很多
HTable
的实例,当我在记录上使用
put
时,这些实例创建了太多的线程。(我正在使用映射器并在
map
函数中创建它)

我会检查您与HBase的连接是否被大量创建(在循环或
map
函数中)。如果发生这种情况,那么将其移动以实例化较少的与HBase的连接(我使用了
HTable
)可能会解决此问题。 它解决了我的问题


HTH

我在使用
HTablePool
实例获取
HTableInterface
实例时遇到此错误,但在使用之后,我忘记调用
close()
方法。

我也遇到了同样的问题,正如上面kosii所解释的,根本原因是没有关闭我在使用HTablePool后从HTableInterface获得的HTableInterface实例

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

您可以共享您正在设置的JVM参数吗?当我使用Java客户端连接到HBase时,以及当我将脚本传递到HBase外壳时,都会发生这种情况。外壳脚本只是一个put命令列表,一个接一个。在这两种情况下(使用Java客户端和外壳脚本),在相同的行数之后,我得到了错误。为了继续我之前的评论,我在Java客户端中做了此更改,它确实起了作用…这次我能够插入更多的行。但是,我很困惑为什么我仍然无法通过shell插入超过1600行,或者是什么原因首先导致了此错误。你知道吗?在JAVA,这是一个为NVM中的每个线程分配内存的问题,分配另一个线程的空间不足。我不擅长JVM之类的内部结构,因此我可能会忽略一些细节。对于shell,我不太清楚-但它可能做同样的事情,并尝试为每个put创建一个新线程?耸耸肩我没玩过,所以我不确定。
HTableInterface table = tablePool.getTable(tableName);
// Do the work
....
....
table.close()