3

我在使用 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 gigs 内存)。对于堆栈大小,我给 8mb。我相信 64 位的默认值是 2mb;使用 2mb 时我遇到了同样的错误,将其增加到 8mb 根本没有帮助(无论堆栈大小如何,我都只能插入相同数量的行,~1700)。

我已经读过减小堆大小可以使这个错误消失,但这也无济于事。下面是我正在设置的 jvm 选项(除了堆栈大小,一切都是默认的)。

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

3 回答 3

4

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

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

高温高压

于 2011-02-02T18:24:35.290 回答
0

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

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

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

于 2013-03-12T16:16:43.630 回答