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") )
核心待解决问题
- 如何修复当前节点接入失败的问题,实现从Scala应用成功启动节点并创建IgniteSet?是否存在其他合法的IgniteSet创建路径?
- 针对不同操作场景(缓存访问、缓存创建、集合/队列创建、集合/队列访问),应当如何选型节点类型(瘦客户端、支持客户端/服务端模式的thick节点等)?
内容的提问来源于stack exchange,提问作者roseaysina
相关产品推荐
相关产品推荐

