flume報java.io.IOException: Not a data file的ERROR
阿新 • • 發佈:2019-02-20
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異常結束在啟動時出現上述錯誤。