我在使用 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"