Spark集群运行Scala Jar报NoSuchMethodError:scala.Predef$.refArrayOps求助
Scala打包Jar在Spark服务器运行时出现NoSuchMethodError的原因分析
问题场景
本地IDEA中Scala代码运行正常,但打包成Jar上传到自建Spark服务器运行时,抛出NoSuchMethodError:scala.Predef$.refArrayOps错误。触发错误的代码涉及Array的foreach、sortBy等方法,例如:
val expectArray=expectVertex.take(2).toArray.sortBy(it=>{it._1})
示例代码中的触发点:
inDegrees.collect().foreach(println)
错误日志关键片段:
Caused by: java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object; at org.example.App.run(App.scala:23)
用户本地使用Scala 2.12.7编译,Spark版本为2.4.4,通过Maven的assembly-plugin打包成包含依赖的Jar。
核心原因
Spark与Scala版本不兼容
Spark 2.4.x官方仅支持Scala 2.11系列,并不兼容Scala 2.12。你本地用Scala 2.12.7编译代码,而自建Spark服务器使用的是Scala 2.11环境,两者的类库存在API差异:scala.Predef$.refArrayOps方法在Scala 2.12中是标准方法,但在Scala 2.11中不存在或签名不同,导致运行时找不到该方法。打包方式引发依赖冲突
你使用maven-assembly-plugin的jar-with-dependencies打包,会将本地Scala 2.12的类库一并打入Jar包。上传到Spark服务器后,服务器的类加载器会优先加载Jar包内的Scala类,与服务器自身的Scala 2.11类库产生冲突,进一步触发方法找不到的错误。
内容的提问来源于stack exchange,提问作者axu
相关产品推荐
相关产品推荐

