从gcloud下载SSTable后用sstabledump导出JSON报java.io.EOFException咨询
SSTableExport 运行时EOFException的常见触发原因
原始提问描述:
我编写了一个脚本,会从gcloud下载所有运行sstabledump所需的必要SSTable相关文件,后续将这些文件导出为JSON格式,但执行过程中无故出现如下错误:java.io.EOFException at org.apache.cassandra.io.util.RebufferingInputStream.readByte(RebufferingInputStream.java:180) at org.apache.cassandra.io.util.RebufferingInputStream.readPrimitiveSlowly(RebufferingInputStream.java:142) at org.apache.cassandra.io.util.RebufferingInputStream.readInt(RebufferingInputStream.java:222) at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:157) at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:132) at org.apache.cassandra.tools.Util.metadataFromSSTable(Util.java:317) at org.apache.cassandra.tools.SSTableExport.main(SSTableExport.java:144) java.io.EOFException at org.apache.cassandra.io.util.RebufferingInputStream.readByte(RebufferingInputStream.java:180) at org.apache.cassandra.io.util.RebufferingInputStream.readPrimitiveSlowly(RebufferingInputStream.java:142) at org.apache.cassandra.io.util.RebufferingInputStream.readInt(RebufferingInputStream.java:222) at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:157) at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:132) at org.apache.cassandra.tools.Util.metadataFromSSTable(Util.java:317) at org.apache.cassandra.tools.SSTableExport.main(SSTableExport.java:144)提问:导致该错误的可能原因有哪些?
可能的原因
- SSTable文件下载不完整:从堆栈定位可见,报错发生在SSTable元数据的反序列化阶段。如果gcloud拉取文件时出现网络中断、下载超时、分片校验失败未重试的情况,会直接截断对应
-Metadata.db元数据文件,程序读到文件末尾时仍未读完预期长度的元数据内容,就会触发EOFException。 - SSTable配套文件缺失或混放:单套SSTable是由数据文件、索引文件、压缩元文件、校验摘要文件等多个配套文件组成的集合,脚本如果拉取时漏了某个配套文件,或是把不同SSTable的文件放置到了同一目录下,程序读取元数据时会找不到预期的文件结构,输入流提前到达末尾就会抛出该异常。
- Cassandra版本不匹配:本地运行SSTableExport的Cassandra版本,和远端生成对应SSTable的Cassandra版本存在差异时,不同版本的SSTable元数据序列化结构不兼容,程序按本地版本的规则读取文件时,会提前触达流的末尾,在元数据反序列化阶段抛出EOF错误。
- 文件内容损坏:下载后的文件如果经过无校验的转存、本地存储磁盘存在坏道、脚本写入时缓冲区异常覆盖,会导致文件内容和源端文件不一致,元数据段被非预期内容改写后,程序读完整个文件仍未达到预期的读取长度,就会触发EOF异常。
内容的提问来源于stack exchange,提问作者Ema Il
相关产品推荐
相关产品推荐

