HBase unable to create new native thread 错误解决方法

好多次向Hbase插入数据的时候(三台节点,一次性插入百万条数据),时不时的会发生:

java.lang.OutOfMemoryError: unable to create new native thread

内存不够了?但是我一看不对啊,内存够啊。那到底是什么原因呢?
后来查了一下是因为线程开启过多,超过限制了,至于受哪些限制大家可以参考下面一篇文章,写的非常好:

http://jzhihui.iteye.com/blog/1271122
从文中我们知道,响线程数量的因素有下面几个:
1.-Xms : intial java heap size
2 -Xmx : maximum java heap size
3 -Xss : the stack size for each thread
4 系统限制 : 系统最大可开线程数

但是具体是哪个原因的?搞了半天没搞好,后来通过查询HBase参考手册找到了答案:

http://hbase.apache.org/book.html

文档比较长,进去后搜索关键字:“nproc” 第一个就是,大概意思是,在一定的负载环境下,太低的 最大线程数会导致outOfMemoryError。

好了,接下来我们对用户分配的最大线程进行修改,首先我们先用ulimit -a 指令来查看以下默认系统限制(centOS6.6):
HBase unable to create new native thread 错误解决方法_第1张图片
看倒数第三行:max user processes : 1024
说明用户默认情况下只能启动1024个线程,这就是导致Hbase插入数据OutOfMemoryError的原因。

接下来我们修改下配置文件:
/etc/security/limits.d/90-nproc.conf
照猫画虎,为运行Hbase的用户分配更多的线程,如下所示:

hadoop     soft    nproc     10240 

登出用户再重新登陆,就可以生效了,再次运行HBase任务,搞定!

你可能感兴趣的:(hbase)