java.io.EOFException 使用 sstabledump

java.io.EOFException using sstabledump

我有一个脚本可以从 gcloud 下载使用 sstabledump 所需的所有文件,然后将它们转储到 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)

知道为什么会发生这种情况吗?

这表明一个(或多个)SSTables 不完整或损坏。

抛出文件结束异常 (EOFException),因为 SSTable 元数据指示 *-Data.db 文件中还有更多数据,但已到达文件末尾。

如果您从实时 data/* 子目录复制文件,这是预料之中的,因为文件不一定 (a) 完全刷新到磁盘,或 (b) 尚未完全压缩。

我建议你做一个nodetool snapshot并且只从snapshots/*子目录复制SSTables以确保文件完全一致。干杯!