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任务,操作成功!!




如果觉得对你有帮助,不如花0.5元请作者吃颗糖,让他甜一下吧~~
![](https://img2018.cnblogs.com/blog/1011838/201809/1011838-20180913204127142-1968807170.png)
### 回答1: 这个错误是因为Spark无法找到HBase的配置文件。可能是因为HBase的依赖库没有正确地添加到Spark的classpath中。您需要确保在Spark的classpath中包含了HBase的依赖库,或者将HBase的依赖库添加到Spark的lib目录中。 ### 回答2: 在使用Spark读取HBase候,如果出现java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”的报错,一般是由于缺少了HBase依赖包或者版本不匹配导致的。 解决方法如下: 1. 确认HBase依赖包是否存在,以及是否与Spark版本兼容。 可以通过以下两种方式解决: ① 直接将HBase的依赖包复制到Spark的lib目录中。具体操作:将HBasehbase-client-xxx.jar和hbase-common-xxx.jar复制到Spark的安装目录下的lib目录即可。 ② 修改Spark的pom.xml文件,添加HBase的依赖。具体操作:在Spark源码根目录中的pom.xml文件中添加以下代码: <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>x.x.x</version> </dependency> 注意:x.x.x表示HBase的版本号,需要根据实际情况替换。 2. 确认HBase配置文件是否正确。 如果上述方法解决不了问题,可能是HBase的配置文件不正确导致的。请确认HBasehbase-site.xml文件中是否有以下配置项: <property> <name>hbase.client.keyvalue.maxsize</name> <value>2097152</value> </property> 如果没有,请手动添加并重启HBase服务。 3. 确认系统环境变量是否正确。 如果上述方法都没有解决问题,可以检查系统的环境变量是否正确。请确认系统的HADOOP_CLASSPATH、JAVA_HOME、HBASE_HOME和SPARK_HOME环境变量是否正确设置,以及是否包含了HBaseSpark的相关依赖。 综上所述,出现java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”报错,在排查的过程中需要关注HBase依赖包、配置文件和系统环境等多方面的原因。需要进行彻底的排查才能找到问题的症结并解决问题。 ### 回答3: 在 Spark读取 HBase ,可能会出现java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”这个错误。这是因为在 Spark 中没有找到一些必需的 HBase 的类文件,导致无法成功读取 HBase 数据。 解决此问题的步骤如下: 第一步:检查 Classpath 环境变量 请确保 Classpath 环境变量中包含 HBase 和 Hadoop 的 JAR 文件的路径。因为这两个框架的配置文件都被加载到这些 JAR 文件中,如果 Spark 找不到它们,就会导致错误。 如果 Classpath 设置正确,那么需要检查 Spark 主节点的 Spark 配置中是否包含 HBase 和 Hadoop 的 JAR 文件。 这可以通过将 HBase 和 Hadoop JAR 文件置于 Spark 的 lib 目录中来实现。可以使用以下命令检查 SPARK_HOME/lib 目录中是否存在 HBase 和 Hadoop 的 JAR 文件: $ ls $SPARK_HOME/lib | grep -i hbase $ ls $SPARK_HOME/lib | grep -i hadoop 第二步:检查 HBASE_CLASSPATH 环境变量 如果在环境变量中将 HBASE_CLASSPATH 设置为包含配置文件的路径,那么 Spark 可能不会找到它们。 要更正此错误,请确保在 Shell 中运行 HBase 脚本也加载了这些配置文件。可以通过将 HBase 目录添加到 HBASE_CLASSPATH 环境变量中来实现,例如: $ export HBASE_CLASSPATH=$HBASE_HOME/conf 第三步:操作系统权限问题 还有可能出现因操作系统权限不足而导致无法读取 HBase 数据的情况。此,可以修改文件的权限以解决此问题。可以使用以下命令检查当前目录下的权限: $ ls -ld $PWD 如果权限不正确,可以使用以下命令更正: $ chmod 777 $PWD 总之,如果 Spark 在从 HBase 读取数据遇到“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”错误,需要按照上述步骤检查并修复问题,以确保 Spark 可以顺利地从 HBase 读取数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值