我在 CentOS 7 上使用的是 Cassandra 3.9 版。 启动 Cassandra Server 时,我收到如下错误::
TRACE [MemtableFlushWriter:1] 2017-05-15 04:25:49,735 LogTransaction.java:264 - 关闭事务日志 [mc_txn_flush_3f6a46f0-3961-11e7-87b4-0728ea39fb0d.log in /var/lib/cassandra/data/system/本地-7ad54392bcdd35a684174e047860b377]
错误 [主要] 2017-05-15 04:25:49,745 CassandraDaemon.java:747 - 启动时遇到异常java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError:无法初始化类 com.sun.jna.Native 位于 org.apache.cassandra.utils.FBUtilities.waitOnFuture(FBUtilities.java:403) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.SystemKeyspace.forceBlockingFlush(SystemKeyspace.java:793) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.SystemKeyspace.removeTruncationRecord(SystemKeyspace.java:639) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.ColumnFamilyStore.invalidate(ColumnFamilyStore.java:541) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.ColumnFamilyStore.invalidate(ColumnFamilyStore.java:517) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator.lambda$unloadLegacySchemaTables$341(LegacySchemaMigrator.java:137) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator$$Lambda$93/1308179535.accept(未知 来源)~[na:na] at java.lang.Iterable.forEach(Iterable.java:75) 〜[na:1.8.0_45] 在 org.apache.cassandra.schema.LegacySchemaMigrator.unloadLegacySchemaTables(LegacySchemaMigrator.java:137) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator.migrate(LegacySchemaMigrator.java:83) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:254) [apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:730) [apache-cassandra-3.9.0.jar:3.9.0]
这个问题有一个解决方案(Cassandra在ARM64机器上启动失败(java.lang.NoClassDefFoundError:无法初始化类com.sun.jna.Native) ),Soultion 建议对 cassandra-env.sh 进行更改。我尝试过,但它对我不起作用。
我在 cassandra-env.sh
中(单独)检查了这些选项JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/home/tech/cassandra/tmp"
JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/home/cassandra/tmp"
JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/var/lib/cassandra/tmp"
甚至尝试过
JVM_OPTS="$JVM_OPTS -Dcassandra.boot_without_jna=true"
但问题没有改变。
我将 cassandra 记录器更改为 TRACE,但它显示的错误日志与之前没有 TRACE 的错误日志相同。文件(jna-4.0.0.jar)位于 lib 文件夹(/usr/share/cassandra/lib)中。我无法找到真正的原因是什么。
不为我工作的原因如下:
cassandra-env.sh 由服务器加载。 (如果加载了如何检查是否加载)
可能还有其他问题。
有人,请让我摆脱困境。
最后是jna-4.0.0.jar的问题。
lib 中的文件 jna-4.0.0.jar 未初始化,因此我通过创建 jna.jar 的符号链接来更改该文件。
sudo yum install jna
sudo ln -s (JAVA_PATH)/usr/share/java/jna.jar (CASSANDRA_PATH)/usr/share/cassandra/lib
然后它产生了一些关于 tmp 的错误,用以前的解决方案解决了。
关于JNA,那边已经有一些问题了,但是不具体。
我也遇到了同样的问题。清理(rm -rf *) /tmp 文件夹或“-Djava.io.tmpdir”指向的文件夹
升级Java后,Cassandra无法启动。我修好了。
1. mkdir -p /var/lib/cassandra/tmp chown cassandra:cassandra /var/lib/cassandra/tmp
2. 将以下参数添加到文件 /cassandra-env.sh 的末尾 JVM_OPTS =“$ JVM_OPTS -Djava.io.tmpdir = / var / lib / cassandra / tmp”
然后重新启动 Cassandra。
对于未来的人们...
我在 system.log 文件中看到 NoClassDefFound。
我尝试了 tmp 更改,但无济于事。然后我看了
sudo journalctl -u cassandra.service
我明白了
/etc/cassandra/cassandra-env.sh: Syntax error: Unterminated quoted string
这样我的浏览会有所帮助。
我面临同样的错误:
java.lang.NoClassDefFoundError: Could not initialize class com.sun.jna.Native
我是这样解决的:
删除旧的 JNA JAR:
I deleted the old JNA JAR file that came with Cassandra. The file is located in the lib directory of your Cassandra installation:
rm $CASSANDRA_HOME/lib/jna-*.jar
下载最新的 JNA JAR: 我从官方 JNA GitHub 存储库下载了最新的 JNA JAR。您可以在这里找到最新版本。
或者,您可以直接从 Maven Central 下载它。例如,要下载 JNA 版本 5.8.0,请使用以下 URL:
https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar
将新的 JNA JAR 放入 Cassandra lib 目录中: 下载新的 JNA JAR 后,将其放入 Cassandra 安装的 lib 目录中:
cp /path/to/downloaded/jna-5.8.0.jar $CASSANDRA_HOME/lib/
重新启动卡桑德拉: 最后,重新启动 Cassandra 实例以应用更改。
通过更新 JNA 库,解决了 NoClassDefFoundError,Cassandra 成功启动。