You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cassandra3.0.23用SSTableLoader导入单表报Buffer.limit异常如何排查

故障根因定位

从提供的异常栈可以判断,报错并不是真的无法读取目标路径,而是SSTableLoader在解析路径下的SSTable索引文件时,复合主键序列化结构不匹配导致ByteBuffer操作越界,被上层逻辑封装为路径文件列表失败的异常。

排查步骤
  • 校验源表与目标表的Schema完全一致
    异常栈明确指向CompositeType.splitName方法报错,首先排查失败表的复合主键组成、字段类型、排序规则、压缩/序列化配置是否完全相同。分别在源集群和目标集群执行DESCRIBE TABLE <键空间名>.<表名>;对比输出,哪怕主键字段顺序、类型有微小差异都会导致解析失败。
  • 校验快照文件完整性
    执行sstableutil --check /var/lib/cass-bk-tmp/local/intervals命令扫描目录下所有SSTable文件,确认文件没有损坏。如果快照生成过程中源节点存在异常写入、磁盘IO故障,会生成不完整的索引文件,导致解析失败。如果校验报错,重新在源节点执行nodetool snapshot生成新的快照后再尝试导入。
  • 确认文件权限配置正确
    检查执行SSTableLoader的操作系统用户,是否对/var/lib/cass-bk-tmp/local/intervals下所有文件有读权限、对SSTableLoader的临时工作目录有写权限,权限不足会被上层逻辑封装为文件读取失败的异常。可执行chmod -R a+r /var/lib/cass-bk-tmp/local/intervals临时放开读权限测试导入是否正常。
  • 验证SSTable格式兼容性
    确认源集群是否安装过自定义补丁、开启过非默认的SSTable序列化配置,即使大版本都是3.0.23,自定义修改的序列化逻辑也会导致官方版本的SSTableLoader无法解析。可以先在源节点本地用同版本的sstableloader导入测试节点,确认快照本身可以被正常解析。
  • 跳过索引校验临时规避
    如果上述排查都无异常,可以在执行sstableloader时添加JVM参数-Dcassandra.skip_index_check=true跳过索引校验环节,导入完成后手动执行nodetool rebuild_index <键空间名> <表名>重建对应索引,规避索引文件损坏导致的导入失败。
完整异常栈
Failed to list files in /var/lib/cass-bk-tmp/local/intervals
java.lang.IllegalArgumentException
java.lang.RuntimeException: Failed to list files in /var/lib/cass-bk-tmp/local/intervals
        at org.apache.cassandra.db.lifecycle.LogAwareFileLister.list(LogAwareFileLister.java:77)
        at org.apache.cassandra.db.lifecycle.LifecycleTransaction.getFiles(LifecycleTransaction.java:599)
        at org.apache.cassandra.io.sstable.SSTableLoader.openSSTables(SSTableLoader.java:76)
        at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:165)
        at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:106)
Caused by: java.lang.IllegalArgumentException
        at java.nio.Buffer.limit(Buffer.java:275)
        at org.apache.cassandra.utils.ByteBufferUtil.readBytes(ByteBufferUtil.java:669)
        at org.apache.cassandra.utils.ByteBufferUtil.readBytesWithShortLength(ByteBufferUtil.java:678)
        at org.apache.cassandra.db.marshal.CompositeType.splitName(CompositeType.java:201)
        at org.apache.cassandra.db.Serializers$1.deserialize(Serializers.java:88)
        at org.apache.cassandra.db.Serializers$1.deserialize(Serializers.java:60)
        at org.apache.cassandra.io.sstable.IndexHelper$IndexInfo$Serializer.deserialize(IndexHelper.java:148)
        at org.apache.cassandra.db.RowIndexEntry$Serializer.deserialize(RowIndexEntry.java:218)
        at org.apache.cassandra.io.sstable.format.SSTableReader.buildSummary(SSTableReader.java:825)
        at org.apache.cassandra.io.sstable.format.SSTableReader.openForBatch(SSTableReader.java:429)
        at org.apache.cassandra.io.sstable.SSTableLoader.lambda$openSSTables$0(SSTableLoader.java:121)
        at org.apache.cassandra.db.lifecycle.LogAwareFileLister.lambda$innerList$2(LogAwareFileLister.java:99)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
        at java.util.TreeMap$EntrySpliterator.forEachRemaining(TreeMap.java:2969)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
        at org.apache.cassandra.db.lifecycle.LogAwareFileLister.innerList(LogAwareFileLister.java:101)
        at org.apache.cassandra.db.lifecycle.LogAwareFileLister.list(LogAwareFileLister.java:73)
        ... 4 more

内容的提问来源于stack exchange,提问作者Rich Adams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:48:03