1. 程式人生 > >flume報java.io.IOException: Not a data file的ERROR

flume報java.io.IOException: Not a data file的ERROR

flume清洗時報錯 java.io.IOException: Not a data file,錯誤如下圖:

opening file 的檔案明明是一個數據檔案,非要說不是資料檔案。沒辦法,追蹤錯誤,查詢原始碼去。。。

結果在 package org.apache.avro.file中的 DataFileStream 類的initialize(InputStreamin)方法中發現了異常的出處,程式碼如下:

void initialize(InputStream in) throws IOException {
        this.header = new DataFileStream.Header();
        this.vin = DecoderFactory.get().binaryDecoder(in, this.vin);
        byte[] magic = new byte[DataFileConstants.MAGIC.length];

        try {
            this.vin.readFixed(magic);
        } catch (IOException var10) {
            throw new IOException("Not a data file.");
        }

......

在 readFixed 時異常了,真正的異常是 var10 ,不知道哪位大神把異常換成了 Not a data file了。

我想看 var10 的異常怎麼辦呢?只好重寫原始碼了,把 var10 打粗來。

真正的錯誤來啦!

java.io.EOFException 異常啊。查了下,說是讀取檔案的問題。

繼續研究,發現是flume的一個BUG。

官方給的解釋:https://issues.apache.org/jira/browse/AVRO-813

我們的解決方案是:把spooldir的source跟蹤的目錄下的元資料檔案刪除既可。

flume跟蹤的目錄下會自動產生 .flumespool資料夾,裡面有 .flumespool-main.meta 檔案。該檔案我理解的是儲存的讀取檔案的 offset,

在讀取該檔案的時候出現了異常,將該檔案刪除,一切OK啦。缺點呢是可能會造成資料少量的重複。 

那也沒辦法了,少量的容錯老子接受了 ,最後重寫source元件,只要該異常出現就刪除.meta檔案即可。防止flume異常結束在啟動時出現上述錯誤。