spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new nat...
这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的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。
至于为什么需要修改这里,可以看看这篇blog。
在里面添加
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任务,操作成功!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云数据库9月刊:一文看懂2018杭州云栖大会阿里云数据库的重大发布
重点事件 一、 2018杭州云栖大会阿里云数据库的重大发布本次大会阿里云数据库团队共有3个专场/峰会、1个Clouder Lab和29场分享。其中包括3个产品战略合作发布、1个英文圆桌论坛、3场媒体专访,受访嘉宾达到10人。内容既有来自一线的云数据库客户分享数字化转型实践,也有海外数据库原厂大咖如MySQL之父Monty、PostgreSQL创始人Bruce,以及EDB CEO Ed Boyajian等重磅嘉宾的现身,所有场次均有线上直播,覆盖150万用户。 1、POLARDB媒体专访/客户案例故事/Clouder Lab本次云栖大会POLARDB第一次带客户做专访,媒体看到POLARDB落地非常有说服力,让媒体深感POLARDB “来势汹汹”。POLARDB的宣传视频在主会场、各分论坛/峰会、阿里巴巴各大园区进行了推广播放,大
- 下一篇
Hadoop的集群环境部署说明
Hadoop集群环境搭建是很多学习hadoop学习者或者是使用者都必然要面对的一个问题,网上关于hadoop集群环境搭建的博文教程也蛮多的。对于玩hadoop的高手来说肯定没有什么问题,甚至可以说事“手到擒来”的事情,但对于hadoop的初学者来说,hadoop集群环境的搭建着实压力不小。 网上关于hadoop集群环境搭建的文章有很多,可以说是“图文并茂”,对于新手而言即使步骤再详细,但看着这么多步骤,那么多的指令肯定是会觉得很繁琐的。毕竟都是从菜鸟一步一步过来的,记得当初做hadoop集群环境搭建真的是很烦琐。 目前国内的hadoop商业发行版虽然比较多,但是在集群环境的搭建方面基本都很类似或者是相同,指令多、步骤繁琐。有的时候觉得不免觉得很奇怪,这些发行商为什么不对hadoop的集群环境部署做一下优化呢?幸运的是总算是让我找到了一个hadoop发行版集群环境搭建简单易用。 这里使用的是一款国产的hadoop发行版,大快搜索推出的DKhadoop。集群环境的部署总体给我的感觉是比较简单易用,不像以前的一些发行版那么繁琐。下面就给大家以DKhadoop为例介绍一下这种简单易用的hado...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果