我目前正在使用 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:在 org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:102) 62513:在 org.apache.avro.file.DataFileStream.(DataFileStream.java:84)
有没有人遇到过这样的 0 字节损坏的 avro 文件。原因是什么,因为通过代码我不清楚这怎么可能,因为尝试在本地复制我总是得到几个带有标题的字节。我真的需要在关闭它们并以原子方式移动它们之后对我的 avro 文件进行 fsync 吗?是否在任何元数据或标头同步到磁盘之前移动文件。(我的环境是 GCP 上的 Google 计算实例)任何有关调试的见解都会非常有帮助。