You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:52