Cassandra重启报错 java.lang.ClassCastException

本文详细描述了使用Cassandra 1.1.1版本创建表格并插入数据后,重启服务时遇到的Java.lang.ClassCastException错误。原因在于Cassandra的一个已知bug,解决方法是删除saved_caches_directory文件夹中的文件,并重启服务即可恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过CQL创建了若干表格,比如:

CREATE TABLE fileindex(
recid varchar,
agentno varchar,
customerno varchar,
recfile varchar,
createtime varchar,
PRIMARY KEY(recid)
);

CREATE INDEX ON fileindex(agentno);
CREATE INDEX ON fileindex(customerno);
CREATE INDEX ON fileindex(recfile);
CREATE INDEX ON fileindex(createtime);

 然后再表中插入若干数据,运行了一段时间后,重启Cassandra,报了下面的错:

java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.nio.ByteBuffer
at org.apache.cassandra.db.marshal.UTF8Type.compare(UTF8Type.java:27)
at org.apache.cassandra.dht.LocalToken.compareTo(LocalToken.java:45)
at org.apache.cassandra.db.DecoratedKey.compareTo(DecoratedKey.java:89)
at org.apache.cassandra.db.DecoratedKey.compareTo(DecoratedKey.java:38)
at java.util.TreeMap.getEntry(TreeMap.java:328)
at java.util.TreeMap.containsKey(TreeMap.java:209)
at java.util.TreeSet.contains(TreeSet.java:217)
at org.apache.cassandra.io.sstable.SSTableReader.load(SSTableReader.java:396)
at org.apache.cassandra.io.sstable.SSTableReader.open(SSTableReader.java:187)
at org.apache.cassandra.io.sstable.SSTableReader$1.run(SSTableReader.java:225)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.nio.ByteBuffer
at org.apache.cassandra.db.marshal.UTF8Type.compare(UTF8Type.java:27)
at org.apache.cassandra.dht.LocalToken.compareTo(LocalToken.java:45)
at org.apache.cassandra.db.DecoratedKey.compareTo(DecoratedKey.java:89)
at org.apache.cassandra.db.DecoratedKey.compareTo(DecoratedKey.java:38)

  

找了半天,终于找到答案,原来是Cassandra1.1.1的一个bug(将在Cassandra1.1.2中修复)。

https://issues.apache.org/jira/browse/CASSANDRA-4331

 

解决方法就是删除saved_caches_directory文件夹中的文件,默认位置是/var/lib/cassandra/saved_caches

 

然后再重启就没问题了

025-07-03T15:46:22.723543009+08:00 stdout F 07:46:22.723 [main] ERROR org.apache.cassandra.io.util.FileUtils - FATAL: Cassandra is unable to access required classes. This usually means it has been run without the aid of the standard startup scripts or the scripts have been edited. If this was intentional, and you are attempting to use Java 11+ you may need to add the --add-exports and --add-opens jvm options from either jvm11-server.options or jvm11-client.options 2025-07-03T15:46:22.723543009+08:00 stdout F java.lang.IllegalAccessException: access to public member failed: jdk.internal.ref.Cleaner.clean[Ljava.lang.Object;@7d898981/invokeVirtual, from org.apache.cassandra.io.util.FileUtils (unnamed module @63d4e2ba) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MemberName.makeAccessException(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.checkAccess(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.checkMethod(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.unreflect(Unknown Source) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.io.util.FileUtils.<clinit>(FileUtils.java:99) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.guessFileStore(DatabaseDescriptor.java:1208) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.applySimpleConfig(DatabaseDescriptor.java:550) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.applyAll(DatabaseDescriptor.java:350) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:178) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:162) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.applyConfig(CassandraDaemon.java:812) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:748) 2025-07-03T15:46:22.723543009+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:893) 2025-07-03T15:46:22.723939593+08:00 stdout P Exception (java.lang.ExceptionInInitializerError) encountered during startup: null 2025-07-03T15:46:22.723979395+08:00 stdout F 2025-07-03T15:46:22.724179420+08:00 stderr P java.lang.ExceptionInInitializerError 2025-07-03T15:46:22.724190507+08:00 stderr F 2025-07-03T15:46:22.724269667+08:00 stderr F at org.apache.cassandra.config.DatabaseDescriptor.guessFileStore(DatabaseDescriptor.java:1208) 2025-07-03T15:46:22.724321597+08:00 stderr F at org.apache.cassandra.config.DatabaseDescriptor.applySimpleConfig(DatabaseDescriptor.java:550) 2025-07-03T15:46:22.724342025+08:00 stderr P at org.apache.cassandra.config.DatabaseDescriptor.applyAll(DatabaseDescriptor.java:350) 2025-07-03T15:46:22.724364118+08:00 stderr F 2025-07-03T15:46:22.724449226+08:00 stderr P at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:178) 2025-07-03T15:46:22.724462413+08:00 stderr F 2025-07-03T15:46:22.724507351+08:00 stderr F at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:162) 2025-07-03T15:46:22.724533838+08:00 stderr P at org.apache.cassandra.service.CassandraDaemon.applyConfig(CassandraDaemon.java:812) 2025-07-03T15:46:22.724547333+08:00 stderr F 2025-07-03T15:46:22.724567912+08:00 stderr P at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:748) 2025-07-03T15:46:22.724577419+08:00 stderr F 2025-07-03T15:46:22.724596102+08:00 stderr P at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:893) 2025-07-03T15:46:22.724605534+08:00 stderr F 2025-07-03T15:46:22.724743010+08:00 stderr P Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: access to public member failed: jdk.internal.ref.Cleaner.clean[Ljava.lang.Object;@7d898981/invokeVirtual, from org.apache.cassandra.io.util.FileUtils (unnamed module @63d4e2ba) 2025-07-03T15:46:22.724759623+08:00 stderr F 2025-07-03T15:46:22.724796764+08:00 stderr P at org.apache.cassandra.io.util.FileUtils.<clinit>(FileUtils.java:110) 2025-07-03T15:46:22.724831605+08:00 stderr F 2025-07-03T15:46:22.724842297+08:00 stderr P ... 8 more 2025-07-03T15:46:22.724852948+08:00 stderr F 2025-07-03T15:46:22.724917495+08:00 stderr P Caused by: java.lang.IllegalAccessException: access to public member failed: jdk.internal.ref.Cleaner.clean[Ljava.lang.Object;@7d898981/invokeVirtual, from org.apache.cassandra.io.util.FileUtils (unnamed module @63d4e2ba) 2025-07-03T15:46:22.724928367+08:00 stderr F 2025-07-03T15:46:22.724962497+08:00 stderr P at java.base/java.lang.invoke.MemberName.makeAccessException(Unknown Source) 2025-07-03T15:46:22.724973277+08:00 stderr F 2025-07-03T15:46:22.724992712+08:00 stderr P at java.base/java.lang.invoke.MethodHandles$Lookup.checkAccess(Unknown Source) 2025-07-03T15:46:22.725002117+08:00 stderr F 2025-07-03T15:46:22.725046030+08:00 stderr F at java.base/java.lang.invoke.MethodHandles$Lookup.checkMethod(Unknown Source) 2025-07-03T15:46:22.725081741+08:00 stderr F at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(Unknown Source) 2025-07-03T15:46:22.725125434+08:00 stderr P at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(Unknown Source) 2025-07-03T15:46:22.725136176+08:00 stderr F 2025-07-03T15:46:22.725147506+08:00 stderr P at java.base/java.lang.invoke.MethodHandles$Lookup.unreflect(Unknown Source) 2025-07-03T15:46:22.725158852+08:00 stderr F 2025-07-03T15:46:22.725192482+08:00 stderr F at org.apache.cassandra.io.util.FileUtils.<clinit>(FileUtils.java:99) 2025-07-03T15:46:22.725214073+08:00 stderr P ... 8 more 2025-07-03T15:46:22.725233470+08:00 stderr F 2025-07-03T15:46:22.725767279+08:00 stdout F 07:46:22.725 [main] ERROR org.apache.cassandra.service.CassandraDaemon - Exception encountered during startup 2025-07-03T15:46:22.725767279+08:00 stdout F java.lang.ExceptionInInitializerError: null 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.guessFileStore(DatabaseDescriptor.java:1208) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.applySimpleConfig(DatabaseDescriptor.java:550) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.applyAll(DatabaseDescriptor.java:350) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:178) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.config.DatabaseDescriptor.daemonInitialization(DatabaseDescriptor.java:162) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.applyConfig(CassandraDaemon.java:812) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:748) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:893) 2025-07-03T15:46:22.725767279+08:00 stdout F Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: access to public member failed: jdk.internal.ref.Cleaner.clean[Ljava.lang.Object;@7d898981/invokeVirtual, from org.apache.cassandra.io.util.FileUtils (unnamed module @63d4e2ba) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.io.util.FileUtils.<clinit>(FileUtils.java:110) 2025-07-03T15:46:22.725767279+08:00 stdout F ... 8 common frames omitted 2025-07-03T15:46:22.725767279+08:00 stdout F Caused by: java.lang.IllegalAccessException: access to public member failed: jdk.internal.ref.Cleaner.clean[Ljava.lang.Object;@7d898981/invokeVirtual, from org.apache.cassandra.io.util.FileUtils (unnamed module @63d4e2ba) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MemberName.makeAccessException(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.checkAccess(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.checkMethod(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at java.base/java.lang.invoke.MethodHandles$Lookup.unreflect(Unknown Source) 2025-07-03T15:46:22.725767279+08:00 stdout F at org.apache.cassandra.io.util.FileUtils.<clinit>(FileUtils.java:99) 2025-07-03T15:46:22.725767279+08:00 stdout F ... 8 common frames omitted这个是什么报错启动命令是podman run -d \ --name cassandra \ --network janusgraph-net \ --privileged \ -p 9042:9042 \ -v /opt/janusgraph/conf/cassandra:/etc/cassandra:z \ -v /home/iaas/janusgraph-full-0.6.3/cassandra/lib:/usr/share/cassandra/lib:z \ -e CASSANDRA_CONF=/etc/cassandra \ -e CLASSPATH=/usr/share/cassandra/lib/* \ -e CASSANDRA_AUTHENTICATOR=PasswordAuthenticator \ -e CASSANDRA_USER=cassandra \ -e CASSANDRA_CLUSTER_NAME=JanusGraphCluster \ -e JVM_EXTRA_OPTS="--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED" \ docker.io/library/cassandra:4.0这个jdk是11请问
最新发布
07-04
<think>我们正在解决Cassandra在JDK11+环境下启动报错`java.lang.IllegalAccessException:accessto jdk.internal.ref.Cleaner`的问题。这是由于JDK9引入的模块系统(JPMS)导致内部API默认被封装,无法通过反射访问。解决方法是在启动JVM时添加`--add-opens`参数来开放特定模块的访问权限。 根据之前的讨论,我们需要在Cassandra的JVM配置文件中添加以下参数:```properties--add-opens java.base/jdk.internal.ref=ALL-UNNAMED--add-opensjava.base/java.nio=ALL-UNNAMED``` Cassandra的JVM配置文件通常是`conf/jvm.options`(在容器中可能是`/etc/cassandra/jvm.options`或`/opt/janusgraph/conf/cassandra/jvm.options`)。以下是具体步骤: ###步骤1:定位jvm.options文件在容器中,Cassandra的配置文件通常位于`/etc/cassandra/`目录下。如果你使用容器部署,可以通过挂载卷的方式修改宿主机上的文件,然后重启容器。###步骤2:编辑jvm.options文件在`jvm.options`文件中添加以下两行(通常在文件末尾,但确保不在注释块内):```properties#开放JDK内部模块访问权限以解决IllegalAccessException--add-opens java.base/jdk.internal.ref=ALL-UNNAMED--add-opensjava.base/java.nio=ALL-UNNAMED``` ###步骤3:重启Cassandra服务修改配置文件后,重启Cassandra使配置生效:```bashpodman restartcassandra#如果使用Podman#或docker restartcassandra#如果使用Docker``` ###替代方法:通过环境变量设置如果无法直接修改配置文件,可以通过环境变量`JVM_EXTRA_OPTS`传递这些参数:```bashpodmanrun -d \...\-e JVM_EXTRA_OPTS="--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED"\cassandra:3.11.14``` ###验证配置是否生效查看Cassandra启动日志,确认JVM参数已加载: ```bashpodmanlogs cassandra |grep "add-opens"``` 如果输出中包含我们添加的参数,则说明配置成功。###原理说明-`--add-opens`:打开指定模块的包,允许其他模块通过反射访问该包下的所有成员(包括私有成员)。 -`java.base/jdk.internal.ref=ALL-UNNAMED`:允许所有未命名模块(通常是用户类路径上的类)访问`java.base`模块中的`jdk.internal.ref`包。这解决了`jdk.internal.ref.Cleaner`的访问问题。 -`java.base/java.nio=ALL-UNNAMED`:同样解决NIO相关内部类的访问问题。 >**注意**:Cassandra3.x官方推荐使用JDK8运行[^1]。如果必须使用JDK11或更高版本,则需要添加这些参数。生产环境建议使用与官方推荐一致的JDK版本以避免兼容性问题。###相关问题1.Cassandra在JDK11+环境下还有哪些常见的兼容性问题? 2.如何为Cassandra配置多个JVM启动参数?3.为什么Cassandra3.x不支持更高版本的JDK(如JDK17)? [^1]: Cassandra官方文档中关于JDK兼容性的说明</think>### 解决 Cassandra 在 JDK 11+ 环境下的 IllegalAccessException 异常 针对 Cassandra 在 JDK 11+ 环境下启动报错 `java.lang.IllegalAccessException: access to jdk.internal.ref.Cleaner` 的问题,这是由于 JDK 9 引入的模块系统(JPMS)加强了内部 API 的访问控制。以下是完整的解决方案: #### 核心解决方法:添加 JVM 模块开放参数 在 `conf/jvm.options` 文件中添加以下参数: ```properties # 开放 JDK 内部模块访问权限 --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED ``` #### 详细操作步骤: 1. **定位并编辑 jvm.options 文件** ```bash # Cassandra 默认配置文件路径 vim /etc/cassandra/jvm.options # 或 JanusGraph 集成环境路径 vim /opt/janusgraph/conf/cassandra/jvm.options ``` 2. **添加参数位置建议** - 在文件末尾添加 - 或在 `### JVM 11+` 配置段后添加 - 避免添加在 `-XX` 参数段内 3. **完整参数示例**: ```properties # JVM 11+ 兼容性配置 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED # 解决 Cleaner 访问异常 --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED ``` #### 备选方案:通过环境变量设置 如果无法直接修改配置文件: ```bash podman run -d \ -e JVM_EXTRA_OPTS="--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED" \ cassandra:3.11.14 ``` #### 验证配置生效: ```bash podman exec cassandra ps -ef | grep cassandra # 输出应包含:--add-opens java.base/jdk.internal.ref=ALL-UNNAMED ``` #### 技术原理说明: 1. **问题根源**: - JDK 9+ 引入模块系统,封装了 `jdk.internal.*` 等内部 API - Cassandra 3.x 使用反射访问 `jdk.internal.ref.Cleaner`(直接内存管理类) - 默认访问规则禁止这种反射操作[^1] 2. **参数作用**: ```mermaid graph LR A[--add-opens] --> B[模块/包=目标模块] B --> C[java.base/jdk.internal.ref] C --> D[ALL-UNNAMED] D --> E[允许类路径上所有类反射访问] ``` 3. **兼容性建议**: - Cassandra 3.x 官方支持 JDK 8[^2] - JDK 11+ 需要额外添加 5-7 个 `--add-opens` 参数 - 生产环境建议使用 JDK 8 或升级到 Cassandra 4.x(原生支持 JDK 11+) > **关键提示**:如果同时出现 `ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC` 错误,需检查 JDK 安装是否完整,确保 `tools.jar` 存在于 JRE 路径中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值