Spark Ignite任务无法保存数据报NoSuchMethodError错误排查
Spark Ignite 写入共享RDD报错排查
我尝试将String类型键与MyPoint类型值的键值对存入Ignite的共享Spark RDD,运行时抛出NoSuchMethodError,相关代码、配置及报错信息如下:
Spark Ignite 代码
package com.knoldus import org.apache.ignite.spark.{IgniteRDD, IgniteContext} import org.apache.ignite.configuration._ import org.apache.spark.{SparkConf, SparkContext} import my.test._ object RDDProducer extends App { println("aaa") val conf = new SparkConf().setAppName("SparkIgnitePro") val sc = new SparkContext(conf) sc.setLogLevel("INFO") val ic = new IgniteContext(sc, "/mnt/ignite/config/node-config.xml",true) println("bbb") val sharedRDD = ic.fromCache[String, my.test.MyPoint]("myCache2") val myMap = Map("1" -> new MyPoint(1,2), "2" -> new MyPoint(3,4)) sharedRDD.savePairs(sc.parallelize(myMap.toSeq) .map{case (id, p) => { (id, p) }}) println("ccc") }
/mnt/ignite/config/default-config.xml 配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="cacheConfiguration"> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="myCache2"/> <property name="cacheMode" value="PARTITIONED"/> <property name="queryEntities"> <list> <bean class="org.apache.ignite.cache.QueryEntity"> <property name="keyType" value="java.lang.String"/> <property name="valueType" value="my.test.MyPoint"/> </bean> </list> </property> </bean> </property> </bean> </beans>
/mnt/ignite/config/node-config.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="clientMode" value="true"/> </bean> </beans>
报错信息
Exception in thread "main" java.lang.NoSuchMethodError: 'scala.collection.immutable.ArraySeq scala.runtime.ScalaRunTime$.wrapRefArray(java.lang.Object[])' at com.knoldus.RDDProducer$.delayedEndpoint$com$knoldus$RDDProducer$1(SparkIgnite.scala:22) at com.knoldus.RDDProducer$delayedInit$body.apply(SparkIgnite.scala:8) at scala.Function0.apply$mcV$sp(Function0.scala:39) at scala.Function0.apply$mcV$sp$(Function0.scala:39)
错误原因
这个报错是Scala版本不兼容导致的。scala.runtime.ScalaRunTime$.wrapRefArray方法的返回类型在Scala 2.12和2.13版本中发生了变更:
- Scala 2.12及更早版本,该方法返回
scala.collection.mutable.ArraySeq - Scala 2.13版本开始,返回类型改为
scala.collection.immutable.ArraySeq
项目中编译代码使用的Scala版本,与Spark、Ignite Spark Connector依赖的Scala版本不匹配,导致运行时找不到对应方法。
解决方案
- 统一Scala版本:确认Spark的Scala版本(Spark 3.x通常对应Scala 2.12或2.13,Spark 2.x对应Scala 2.11),确保项目编译、Spark依赖、Ignite Spark Connector依赖都使用同一版本的Scala。
- 匹配依赖版本:在构建文件(如sbt、Maven)中明确指定Scala版本,同时选择与Spark版本兼容的Ignite Spark Connector。例如使用Spark 3.3 + Scala 2.12时,选择
ignite-spark-2.15.0-scala_2.12这类带Scala版本标识的依赖。 - 清理依赖缓存:删除本地仓库中冲突的依赖包,重新拉取匹配版本的依赖。
额外检查点
- 确保
MyPoint类实现了Serializable接口,否则写入Ignite时会触发序列化错误。 - 检查Ignite客户端节点配置:
node-config.xml中仅开启了客户端模式,需确保客户端能通过默认的TCP发现机制连接到使用default-config.xml启动的Ignite集群(集群和客户端需在同一网络环境)。
内容的提问来源于stack exchange,提问作者Paul Manson
相关产品推荐
相关产品推荐

