但行好事
莫论前程❤

HBase: regionserver启动时报错”无法创建新本地线程”

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

java.io.IOException: java.lang.OutOfMemoryError: unable to create new native thread
        at org.apache.hadoop.hbase.regionserver.HRegion.initializeStores(HRegion.java:943)
        at org.apache.hadoop.hbase.regionserver.HRegion.initializeRegionInternals(HRegion.java:818)
        at org.apache.hadoop.hbase.regionserver.HRegion.initialize(HRegion.java:793)
        at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6520)
        at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6481)
        at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6452)
        at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6408)
        at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:6359)
        at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.openRegion(OpenRegionHandler.java:362)
        at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.process(OpenRegionHandler.java:129)
        at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:129)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

准备

​ 要解决这种问题,你需要有集群每个节点的root权限.我们假设HDFS集群是用hadoop用户启动的.

操作步骤

​ 要解决”无法创建新本地线程”错误, 需在集群的每个节点上执行一遍以下步骤.

  1. 在/etc/security/limits.conf文件中添加一下几个属性,提高hadoop用户可打开进程数的最大值
#vim /etc/security/limits.conf
hadoop soft nproc 32000
hadoop hard nproc 32000
  1. 在/etc/pam.d/login
#vim /etc/pam.d/login
session required pam_limits.so
  1. 退出登录,然后再次以hadoop用户的身份重新进行登录.
  2. 运行如下命令来确认可打开进程数的限制已被提高.
# ulimit -u
32000
  1. 在主节点上重新启动HDFS和HBase.
hadoop@master$ stop-hbase.sh
hadoop@master$ stop-dfs.sh
hadoop@master$ start-dfs.sh
hadoop@master$ start-hbase.sh

运行原理

​ Linux限制了用户可同时执行的进程数量.正如我们前面看到的那样.nproc设置过低会使高负载HBase集群出现OutOfMemoryError异常.如果hadoop用户所运行的进程数超过了nproc的限制.在RegionServer日志中就会出现一个”无法创建新本地线程”的错误.

​ 若要使HBase能顺畅运行,需要提高HDFS和HBase的运行用户的nproc限制值.

​ 我们在第1步中修改了/etc/security/limits.conf文件中hadoop用户的nproc限制.第2步修改/etc/pam.d/login文件的目的是使修改,在该用户下次登录系统时生效.

  • 软限制(soft nproc)是操作内核强制限制的可打开进程数的值.

  • 硬限制(hard nproc)则是软限制的上限

在退出登录之后,我们有重新登录并且执行了ulimit -u程序.以此来查看当前用户的进程数限制.
最后,我们重新启动了HDFS和HBase以使修改生效.

赞(1) 打赏
未经允许不得转载:刘鹏博客 » HBase: regionserver启动时报错”无法创建新本地线程”
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏