spark任务执行异常-java.lang.NoSuchMethodError: org.apache.hadoop.fs.PartialListing

问题描述:提交到yarn集群后任务报错,报错信息如下

java.lang.NoSuchMethodError: org.apache.hadoop.fs.PartialListing

在这里插入图片描述

根据报错信息,初步估计是jar包冲突或者不同jar包有同名类。

排查过程:

使用如下命令查看同名类出现的jar包是哪些:

find /usr/local/service/spark -name “*.jar” -exec grep -Hls “org/apache/hadoop/fs/PartialListing” {} ;

结果如下,有两个jar包有相同类:

在这里插入图片描述

进一步发现hadoop-common-3.2.0.jar中没有PartialListing,且使用这个版本时不会报错,于是可以确定是这个类导致的冲突,jvm规范规定相同加载器不会把同一个类加载两次,虽然在不同包中,但类签名完全相同,虚拟机认为这是同一个类,只会加载其中一个,而加载的这个并非是我们要使用的那个。

解决方案:

这两个包都不可或缺,且hadoop-common包的版本不能回滚到3.2.0,最后尝试将hadoop-common包中的PartialListing的class文件移除,移除之后,应用正常执行。所幸暂未用到这个类,但此处是个隐患。

Guess you like

Origin blog.csdn.net/epitomizelu/article/details/120682217