牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-11-13 投稿人: 浏览次数:465


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异常结束在启动时出现上述错误。



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。