K8s上GridGain厚客户端启动失败:NoSuchMethodError错误求助
GridGain厚客户端启动报错:NoSuchMethodError: PageIO.registerH2
问题描述
我们正尝试将GridGain 8.8.22集成到现有Java客户端应用,构建厚客户端实现内存缓存与近缓存功能。Kubernetes集群中已部署纯内存模式(无持久化)的GridGain主服务器,但客户端启动时抛出java.lang.NoSuchMethodError: org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO.registerH2异常,无法正常启动,且服务端未检测到客户端连接。
客户端Gradle依赖配置
// Ignite def igniteVersion = '8.8.22' compile group: 'org.gridgain', name: 'ignite-core', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-spring', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-indexing', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-h2', version: igniteVersion compile group: 'org.apache.ignite',name: 'ignite-kubernetes', version: '2.4.0'
客户端核心配置代码
IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setClientMode(true); CacheConfiguration<Object, Object> cacheCfg = new CacheConfiguration<Object, Object>(); cacheCfg.setName(cacheName); // 创建近缓存/底层缓存配置 NearCacheConfiguration<Object, Object> nearCfg = new NearCacheConfiguration<>(); nearCfg.setNearEvictionPolicyFactory(new LruEvictionPolicyFactory<>(100_000)); cacheCfg.setNearConfiguration(nearCfg); cfg.setCacheConfiguration(cacheCfg); // 配置Kubernetes发现 TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryKubernetesIpFinder ipFinder = new TcpDiscoveryKubernetesIpFinder(); ipFinder.setNamespace("gridgain"); ipFinder.setServiceName("gridgain-service"); spi.setIpFinder(ipFinder); // 将发现SPI设置到IgniteConfiguration cfg.setDiscoverySpi(spi); Ignite ignite = Ignition.start(cfg);
GridGain主服务器配置
<?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 class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder"> <property name="namespace" value="gridgain"/> <property name="serviceName" value="gridgain-service"/> </bean> </property> </bean> </property> </bean> </beans>
已尝试操作
- 添加索引依赖、调整代码写法,问题未解决
- 因未找到对应GridGain 8.8.22版本的Kubernetes依赖,使用了Apache Ignite 2.4.0的
ignite-kubernetes包
排查思路与解决方案
1. 核心原因:版本依赖冲突
混用GridGain 8.8.22和Apache Ignite 2.4.0的依赖会导致内部类结构不兼容。PageIO.registerH2方法在两个版本中的定义不一致,客户端初始化时触发H2相关逻辑,因版本不匹配找不到方法,抛出异常。
2. 修复依赖配置
GridGain 8.8.22的ignite-core已内置Kubernetes IP Finder实现,无需单独引入Apache Ignite的ignite-kubernetes依赖。修改后的Gradle依赖如下:
// Ignite def igniteVersion = '8.8.22' compile group: 'org.gridgain', name: 'ignite-core', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-spring', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-indexing', version: igniteVersion compile group: 'org.gridgain', name: 'ignite-h2', version: igniteVersion
3. 验证客户端配置与权限
- 客户端代码无需修改,
TcpDiscoveryKubernetesIpFinder类来自GridGain内置的包,删除依赖后可直接使用 - 确保客户端Pod的ServiceAccount拥有访问Kubernetes API的权限,能够列出
gridgain-service的端点资源
4. 异常关联说明
虽然服务端未配置持久化,但客户端的ignite-indexing和ignite-h2依赖会触发内部H2初始化逻辑,版本冲突导致该逻辑执行失败,因此出现了看似与持久化相关的错误。
内容的提问来源于stack exchange,提问作者LostShepherd
相关产品推荐
相关产品推荐

