执行Cassandra sstablesplit时报错“Unknown Keyspace”的问题
Cassandra sstablesplit 报错:Unknown keyspace public
问题场景
停止Cassandra Pod后,将其data目录通过hostPath挂载到另一个同镜像的Pod中,执行以下命令时出错:
root@cas-sleep-pod:/data/cassandra/public# /opt/cassandra/tools/bin/sstablesplit -s 30720 --no-snapshot /data/cassandra/public/timebucket_auditlog_primary-b275e92070a511eda32ced63d2298aec/me-1172-big-Data.db
错误日志
WARN 12:43:44,036 Only 14.359GiB free across all data volumes. Consider adding more capacity to your cluster or removing obsolete snapshots Exception in thread "main" java.lang.AssertionError: Unknown keyspace public at org.apache.cassandra.db.Keyspace.<init>(Keyspace.java:316) at org.apache.cassandra.db.Keyspace.open(Keyspace.java:129) at org.apache.cassandra.db.Keyspace.openWithoutSSTables(Keyspace.java:112) at org.apache.cassandra.tools.StandaloneSplitter.main(StandaloneSplitter.java:114)
目录信息
root@cas-sleep-pod:/data/cassandra/public# ls -ld timebucket_auditlog_primary-b275e92070a511eda32ced63d2298aec/ drwxr-xr-x 3 cassandra cassandra 16384 Aug 23 07:47 timebucket_auditlog_primary-b275e92070a511eda32ced63d2298aec/
原因分析
报错核心是Cassandra无法识别public这个keyspace——临时Pod的Cassandra实例没有加载到该keyspace的元数据。元数据存储在Cassandra的系统表(如system_schema.keyspaces)中,若仅挂载了public子目录、未包含完整的系统表数据,工具就无法关联到对应的keyspace。
解决方法
- 挂载完整数据目录:不要只挂载
/data/cassandra/public,而是挂载整个/data/cassandra目录,确保包含system、system_schema等系统表所在的子目录,让工具能读取到keyspace的元数据。 - 同步配置文件:将原Cassandra Pod的
cassandra.yaml配置文件也挂载到临时Pod中,确保实例使用和原Pod一致的配置,包括数据目录路径、集群名称等关键参数。 - 预创建匹配的keyspace:如果无法挂载完整数据目录,先在临时Pod的Cassandra实例中创建和原keyspace完全一致的
publickeyspace(复制因子、压缩策略、分区键等必须和原配置相同),再执行sstablesplit命令。 - 验证权限:确认临时Pod中
cassandra用户对/data/cassandra目录及子目录拥有完整的读写权限,当前目录权限显示正常,但需检查上层目录权限是否符合要求。
内容的提问来源于stack exchange,提问作者Mark Caleb
相关产品推荐
相关产品推荐

