欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread

程序员文章站 2022-05-13 21:39:59
这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的nproc数量,即用户最大线程数的数量,但我修改了并没有解决问题,最终是通过修改hadoop集群的最大线程数解决问题的。 并且网络上的回答多数关于增加nproc的答案不完整,我这里顺便记录一下。 用户最大线程数可以通过linux下的命令 查看 ......

这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的nproc数量,即用户最大线程数的数量,但我修改了并没有解决问题,最终是通过修改hadoop集群的最大线程数解决问题的。
并且网络上的回答多数关于增加nproc的答案不完整,我这里顺便记录一下。

用户最大线程数可以通过linux下的命令

ulimit -a

查看,屏幕输出中的max user processes就是用户最大线程数,默认通常为1024.

修改这个参数的地方是在/etc/security/limits.conf以及/etc/security/limits.d/90-nproc.conf(可能这个文件的名字会不一样)

/etc/security/limits.conf修改如下

* soft nofile 65536

* hard nofile 65536

xxx soft nproc 65535

xxx hard nproc 65535

其中 xxx表示启动hbase的用户,如使用hadoop启动hbase,则配置如下:

hadoop hard nproc 65535

hadoop soft nproc 65535

这里说明一下,noproc 是代表最大进程数,nofile 是代表最大文件打开数

然后,一般来说,修改ulimit的数值,只需要修改/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf。
至于为什么需要修改这里,可以看看这篇。

在里面添加

hadoop hard nproc 65535

hadoop soft nproc 65535

就修改成功啦。

但这个修改并没有让我的问题得到解决。我从java.lang.outofmemoryerror入手,怀疑是否是hbase或者是datanode的jvm进程内存不足导致内存溢出。于是使用jmap -heap命令分别查看了各个节点的datanode,确实发现了有一些datanode的老年代占有率过高,于是修改hadoop配置文件hadoop_home/etc/hadoop/hadoop-env.sh。在最后添加

export hadoop_datanode_opts="-xmx8192m -xms256m -dcom.sun.management.jmxremote $hadoop_datanode_opts"

这个配置的作用是将datanode的最大内存加到8g,在各个节点修改配置文件,重启datanode。

再次启动spark读取hbase,确实有一点点改善,但最终还是会报错。

这次我再去查看了hadoop的日志,发现了不一样的错误,java.io.ioexception: premature eof from inputstream。

再去网上查,发现其原因是文件操作超租期,实际上就是data stream操作过程中文件被删掉了。通常是因为mapred多个task操作同一个文件,一个task完成后删掉文件导致。这个错误跟dfs.datanode.max.transfer.threads参数到达上限有关。这个是datanode同时处理请求的任务上限,总默认值是 4096,该参数取值范围[1 to 8192]。

这不正是和unable to create new native thread有关吗,继续修改整个集群,在hadoop_home/etc/hadoop/hdfs-site.xml中增加以下配置

<property> 
<name>dfs.datanode.max.transfer.threads</name> 
<value>8192</value> 
</property>

再次启动spark任务,操作成功!!




如果觉得对你有帮助,不如花0.5元请作者吃颗糖,让他甜一下吧~~

spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread