CDH升级Spark2异常java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream

本文记录了在CDH5.16环境下将Spark从1.6版本升级到2.x版本的过程及遇到的问题。在升级过程中,因删除Spark1.6并安装Spark2后,运行Spark命令时出现java.lang.NoClassDefFoundError异常。通过安装Gateway组件、配置Spark-env.sh、部署客户端配置等步骤成功解决问题。

最近为了适配客户版本,搭建了CDH5.16版本的数据数据环境。而默认的Spark是1.6版本的,为配合客户需要升级成Spark2,由于机器资源有限制,先把Spark1.6删除了,下载SPARK2-2.1.0.cloudera3-1.cdh5.13.3.p0.569822-el7.parcel包,进行了安装。安装完成之后,运行Spark的相关命令就报java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream异常,我使用的命令是spark2-submit时报错,其实所有Spark相关命令都是一样的错误。

特别需要注意是:

            spark2的提交命令是Spark2-submit,系统可能会有spark1.6的命令spark-submit干扰

             使用Spark的命令的机器需要安装Gateway组件,然后需要deploy client configuration(部署客户端配置)。个人认为既然使用CDH Manager,如果还去机器上直接改配置的,那还要CDH Manager干啥?网上有很多答案,都说教人要改这改那的,这命令那么命令的,可能别人也没搞明白为啥会出那样的问题。

错误信息如下

[root@hadoop60 ~]# spark2-submit
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
        at org.apache.spark.deploy.SparkSubmitArguments$$anonfun$mergeDefaultSparkProperties$1.apply(SparkSubmitArguments.scala:124)
        at org.apache.spark.deploy.SparkSubmitArguments$$anonfun$mergeDefaultSparkProperties$1.apply(SparkSubmitArguments.scala:124)
        at scala.Option.getOrElse(Option.scala:121)
        at org.apache.spark.deploy.SparkSubmitArguments.mergeDefaultSparkProperties(SparkSubmitArguments.scala:124)
        at org.apache.spark.deploy.SparkSubmitArguments.<init>(SparkSubmitArguments.scala:110)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 7 more
[root@hadoop60 ~]# 

解决步骤

1. 选择需要使用Spark命令的机器上安装Gateway组件

2. 增加Spark-env.sh的配置export SPARK_DIST_CLASSPATH=${SPARK_DIST_CLASSPATH}:$(hadoop classpath)

输入之后,最好行的末尾回车一下

3. 部署Spark客户端配置

4. 如果还不行,可以尝试重启Spark或者集群我忘记了有没有做这一步

 

做了这些步骤之后,就好了。开始网上找来找去,都不合适,网上有很多这个错误的,就是没有一个真正解决的,当今的网络太纷繁复杂了,啥信息都有,很难分辨。抽空写出来,希望对大家有用。

`java.lang.NoClassDefFoundError: org.apache.hadoop.hive.common.auth.HiveAuthUtils` 错误通常表示在运行时缺少某个类文件,这可能是由于依赖库未正确加载、版本不兼容或类路径配置错误引起的。以下是几种可能的解决方法: 1. **检查Hive和Hadoop的版本兼容性** 确保所使用的Hive版本与Hadoop版本兼容。不同版本之间的兼容性问题可能导致某些类无法找到。例如,Hive 1.x 版本通常适用于 Hadoop 2.x 版本[^2]。 2. **确认必要的JAR文件是否已包含在类路径中** `HiveAuthUtils` 是 Hive 的一部分,因此需要确保 `hive-common` 或 `hive-exec` 等相关 JAR 文件已经添加到类路径中。可以通过以下方式验证: - 检查 `$HIVE_HOME/lib` 目录下是否存在所需的 JAR 文件。 - 在启动命令中显式指定 JAR 文件路径,例如使用 `-cp` 参数将 Hive 库添加到类路径中。 3. **更新或重新安装Hive依赖库** 如果发现某些依赖缺失或损坏,可以尝试重新下载并安装 Hive 和 Hadoop 的完整发行包。确保所有必要的库文件都已正确放置,并且没有遗漏关键组件[^3]。 4. **检查Java版本是否兼容** 使用 Java 8 或更高版本时,需要注意某些旧版本的 Hive 可能存在兼容性问题。例如,Hive 1.x 版本对 Java 8 的支持可能存在限制。如果遇到与 Java 版本相关的警告(如 `MaxPermSize=512M` 被忽略),建议升级到更高版本的 Hive 或调整 JVM 参数以适应新版本的垃圾回收机制[^3]。 5. **查看日志以获取更多线索** 运行时日志通常会提供更多关于类加载失败的详细信息。通过分析日志,可以确定是哪个模块或依赖导致了 `NoClassDefFoundError`。 6. **构建项目时确保依赖管理工具配置正确** 如果使用 Maven 或 Gradle 等依赖管理工具,确保 `pom.xml` 或 `build.gradle` 文件中包含了正确的 Hive 和 Hadoop 依赖项。例如,在 Maven 中添加如下依赖: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.1.0-cdh5.15.1</version> </dependency> ``` 7. **清理缓存并重启服务** 有时,旧的类文件可能会被缓存,导致新的依赖无法正确加载。在这种情况下,清理缓存目录(如 `/tmp/hive`)并重启 HiveServer2 服务可能会解决问题。 ### 示例:手动添加Hive依赖到类路径 ```bash # 假设Hive的lib目录位于 /home/hadoop/app/hive/lib export CLASSPATH=/home/hadoop/app/hive/lib/*:$CLASSPATH # 启动HiveServer2时显式指定类路径 java -cp "/home/hadoop/app/hive/lib/*:/path/to/other/libs/*" org.apache.hive.service.server.HiveServer2 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值