You need to enable JavaScript to run this app. Scala应用对接独立Ignite集群创建IgniteSet的连接异常与节点选型指南
优惠活动
大模型
产品
解决方案
定价
更多

Scala应用对接独立Ignite集群创建IgniteSet的连接异常与节点选型指南

Scala应用接入独立部署Ignite集群的问题排查

预期操作目标

  • 基于独立部署的Apache Ignite集群,在Scala应用中创建并填充IgniteSet结构
  • 参照普通Ignite缓存的开发逻辑,在Scala应用中启动客户端/服务端节点接入集群,借助Ignite实例按照官方文档指引创建IgniteSet

当前异常表现

节点无法成功接入集群

报错详情

应用端抛出的异常

Caused by: class org.apache.ignite.IgniteCheckedException: Failed to start SPI: TcpDiscoverySpi [addrRslvr=null, sockTimeout=5000, ackTimeout=5000, marsh=JdkMarshaller [clsFilter=org.apache.ignite.marshaller.MarshallerUtils$1@32f308c6], reconCnt=10, reconDelay=2000, maxAckTimeout=600000, soLinger=0, forceSrvMode=false, clientReconnectDisabled=false, internalLsnr=null, skipAddrsRandomization=false]
...
Caused by: class org.apache.ignite.spi.IgniteSpiException: Failed to deserialize object with given class loader: jdk.internal.loader.ClassLoaders$AppClassLoader@2c13da15

Ignite集群端抛出的异常

Caused by: java.io.InvalidClassException: javax.cache.configuration.MutableConfiguration; local class incompatible: stream classdesc serialVersionUID = 201405, local class serialVersionUID = 201306200821

报错核心指向:javax.cache.configuration.MutableConfiguration 属于javax.cache.cache-api依赖包,集群与应用端加载的类版本不匹配。

已完成的排查动作

  • 版本一致性校验:独立部署的Ignite 2.9.1集群的IGNITE_HOME路径下libs目录包含cache-api-1.0.0.jar;Scala应用的build.sbt中也显式声明了相同版本的依赖,甚至尝试过排除该依赖,对应sbt依赖配置如下:
libraryDependencies ++= Seq(
  ...,
  "javax.cache" % "cache-api" % "1.0.0"
)
  • 类定义校验:官方发布的1.0.0、1.1.0版本javax.cache.cache-api中,MutableConfiguration类的serialVersionUID均为public static final long serialVersionUID = 201306200821L;,不存在serialVersionUID为201405的正式发布版本。
  • 跨场景对照验证:
    • 接入失败的Scala代码(thick节点接入逻辑):
    # fails
    # 端口与集群配置中的TcpDiscoverySpi端口保持一致
    val host = "localhost:45900..46000" # 也尝试过单端口配置
    
    val tcpDiscoverySpi: TcpDiscoverySpi = new TcpDiscoverySpi
    val ipFinder: TcpDiscoveryVmIpFinder = new TcpDiscoveryVmIpFinder
    ipFinder.setAddresses(util.Arrays.asList(host.split(","): _*))
    tcpDiscoverySpi.setIpFinder(ipFinder)
    
    val igniteConfiguration: IgniteConfiguration = new IgniteConfiguration
    igniteConfiguration.setDiscoverySpi(tcpDiscoverySpi)
    igniteConfiguration.setClientMode(false) # 也尝试过设为true
    
    val ignite: Ignite = Ignition.start(igniteConfiguration) # 错误在此处抛出
    
    • Java场景对照:上述相同的thick节点启动逻辑,在Java Spring应用中可正常运行,可顺利接入集群创建Spring Data缓存。
    • Scala场景下可正常运行的接入逻辑(瘦客户端连接器接入):该模式可用于创建普通缓存,但由于IgniteClient实例不支持创建IgniteSet,无法满足开发需求,对应正常运行的代码如下:
    # works as expected
    val host = "localhost"
    val connector_port = "10800" # 与集群配置中的ClientConnectorConfiguration端口保持一致
    
    val cfg = new ClientConfiguration()
          .setAddresses(host + ":" + connector_port)
    
    val ignite: IgniteClient = Ignition.startClient(cfg)
    
    val cache = ignite.getOrCreateCache(...)
    
  • 集群基础信息:当前运行的Ignite集群为本地部署的2.9.1版本,通过bin/ignite.sh脚本启动,配置如下:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.apache.ignite.configuration.IgniteConfiguration">

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="45900"/>
                <property name="localPortRange" value="100"/>

                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">
                        <property name="path" value="/opt/storage/ignite"/>
                    </bean>
                </property>
            </bean>
        </property>


        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="47100"/>
            </bean>
        </property>


        <property name="clientConnectorConfiguration">
            <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
                <property name="port" value="10800"/>
                <property name="portRange" value="100"/>
            </bean>
        </property>


        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="maxSize" value="1073741824"/>
                        <property name="persistenceEnabled" value="true"/>
                    </bean>
                </property>

                <property name="storagePath" value="/opt/storage/ignite"/>
                <property name="walSegmentSize" value="134217728"/>

            </bean>
        </property>

    </bean>

</beans>
  • 集群可用性验证:该集群目前可通过JDBC(jdbc:ignite:thin://localhost:10800)正常连接,可在DataGrip中查看元数据,支持Java应用、Spark Streaming DataFrame正常读写数据。
  • 补充排查进展:参考社区同类问题的排查建议,问题根源可能是传递依赖引入了Geronimo JCache规范包(该包中MutableConfiguration的serialVersionUID为201405L),用户尝试在sbt配置中排除该依赖,但仍遇到相同的报错,对应sbt排除规则如下:
excludeDependencies ++= Seq(
  ExclusionRule("org.apache.geronimo.specs"),
  ExclusionRule("org.apache.geronimo")
)

核心待解决问题

  1. 如何修复当前节点接入失败的问题,实现从Scala应用成功启动节点并创建IgniteSet?是否存在其他合法的IgniteSet创建路径?
  2. 针对不同操作场景(缓存访问、缓存创建、集合/队列创建、集合/队列访问),应当如何选型节点类型(瘦客户端、支持客户端/服务端模式的thick节点等)?

内容的提问来源于stack exchange,提问作者roseaysina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 13:15:06