В настоящее время я использую 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: Not a data file. 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 после их закрытия и атомарного перемещения. Перемещается ли перемещаемый файл перед синхронизацией с диском каких-либо метаданных или заголовков. (моя среда - это экземпляр вычислений Google на GCP) Любые идеи по отладке действительно помогут.
нет на локальный диск GCE, я наблюдаю 0-байтовые файлы на локальных дисках для GCE
Вы пытаетесь записать файл в облачное хранилище?