问题描述:提交到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文件移除,移除之后,应用正常执行。所幸暂未用到这个类,但此处是个隐患。