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

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

这个问题我去网上搜索了一下,发现了很多的解决方案都是增加的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任务,操作成功!!

相关文章
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
398 4
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
821 5
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1598 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
901 23
|
Java Linux Windows
Java“Could Not Create Java Virtual Machine”解决
当在Java中遇到“Could Not Create Java Virtual Machine”错误时,通常是由于内存设置不当、Java版本不兼容、类路径错误或操作系统限制等原因导致JVM无法启动。解决方法包括调整内存参数、确认Java版本兼容性、检查类路径和启动参数、以及检查用户权限和文件系统。
7491 1
|
缓存 Java Linux
java操作hbase报错:KeeperErrorCode=NoNode for /hbase-unsecure/master
java操作hbase报错:KeeperErrorCode=NoNode for /hbase-unsecure/master
1087 2
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
545 4
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
246 2
|
Java 大数据 API
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
419 0
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
Unable to create tempDir. java.io.tmpdir is set to /tmp
Unable to create tempDir. java.io.tmpdir is set to /tmp
251 0