現在、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 バイトの .log ファイルとして永続化されている破損した 0 バイトの avro .tmp ファイルを何らかの方法で書き込んでいると思います。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 コンピューティング インスタンスです)これのデバッグに関する洞察は本当に役に立ちます。