我目前正在使用avro 1.8.2来编写日志事件。我正在观察我的DataFileWriter实际写出0字节文件的某些非常罕见的情况。据我所知,有效的avro文件应始终有标题。 代码段如下所示:
String id = uuidGenerate();
String tmpPath = prefix + id + ".tmp"
String publishedPath = prefix + id + ".log"
DatumWriter<MySchema> datumWriter = new SpecificDatumWriter<>();
DataFileWriter<MySchema> dataFileWriter = new DataFileWriter<>(datumWriter);
create(schema, file)
for (MySchema record : data) {
writer.write(record);
}
writer.close();
Files.move(tmpPath, publishedPath, StandardCopyOption.ATOMIC_MOVE);
我观察的是0字节.log文件,假设移动是原子的,我想我不知何故写了损坏的0字节avro .tmp文件,这些文件作为0字节.log文件保存在磁盘上。 在读回0字节文件时,我得到以下异常:
java.io.IOException:不是数据文件。 62512:at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:102) 62513:at org.apache.avro.file.DataFileStream。(DataFileStream.java:84)
之前有没有人遇到过这样的0字节损坏的avro文件。自从通过代码后的原因是什么我不清楚地知道如何尝试在本地重现这种情况我总是得到几个带标题的字节。 我是否真的需要在关闭它们并原子地移动它们之后fsync我的avro文件。是否在将任何元数据或标头同步到磁盘之前移动文件。 (我的环境是GCP上的Google计算实例) 有关调试的任何见解都会有所帮助。