Flume Spooldir 源的一些问题
Flume Spooldir 源的一些问题
来自:http://blog.xlvector.net/2014-01/flume-spooldir-source-problem/
(
自己写的插件,数据序列化,格式化抛出的异常都会导致flume停止,不能继续取数据,异常可以自己处理
)
最近在用Flume做数据的收集。用到了里面的Spooldir的源在使用中有如下的问题:
- 如果文件的某一行有乱码,不符合指定的编码规范,那么flume会抛出一个exception,然后就停在那儿了。
- spooldir指定的文件夹中的文件一旦被修改,flume就会抛出一个exception,然后停在那儿了。
其实,flume的最大问题就是不够鲁棒。一旦出现问题,不能跳过,只能死在那儿。不知道flume为什么要这么设计。理论上,它应该允许我们在配置文件中指定在遇到错误的行时,是停止还是跳过,不过它目前并不支持这个。所以,我们只能写一个自己的flume的插件了。
https://github.com/xlvector/flume
https://github.com/ponyma/flume
这个插件主要修复了前面提到的两个问题:
- 如果某一行有乱码,flume会忽略这一行
- flume只会check最近N分钟没有修改过的文件
具体修改方法如下。首先,我们继承了SpoolDirectorySource,实现了一个叫做RobustSpoolDirectorySource的类。这个类的代码基本是拷贝了SpoolDirectorySource的代码。但做了如下的修改。
在getNextFile()的函数中,我们发现了一个filter,做了如下的修改
FileFilter filter = new FileFilter() {
public boolean accept(File candidate) {
String fileName = candidate.getName();
if ((candidate.isDirectory()) ||
(fileName.endsWith(completedSuffix)) ||
(fileName.startsWith(".")) ||
ignorePattern.matcher(fileName).matches() ||
(System.currentTimeMillis() - candidate.lastModified() < 600000)) {
return false;
}
return true;
}
};
这里,我们加入了一个条件
(System.currentTimeMillis() - candidate.lastModified() < 600000)
也就是说10分钟之内修改过的文件我们不会处理。
第二个修改是关于编码的,你可以在ReliableSpoolingFileEventReader.java的代码中找到如下的代码:
ResettableInputStream in =
new ResettableFileInputStream(nextFile, tracker,
ResettableFileInputStream.DEFAULT_BUF_SIZE, inputCharset,
DecodeErrorPolicy.FAIL);
这里,我们只需要将DecodeErrorPolicy 改成 DecodeErrorPolicy.IGNORE 即可。
Flume Spooldir 源的一些问题的更多相关文章
- flume【源码分析】分析Flume的启动过程
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- flume【源码分析】分析Flume的拦截器
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- flume spooldir bug修复
BUG:在往目录中copy大文件时,没有复制完,flume就开始读-->导致报错 在代码中体现为:org.apache.flume.client.avro.ReliableSpoolingFil ...
- [ETL] Flume 理论与demo(Taildir Source & Hdfs Sink)
一.Flume简介 1. Flume概述 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据: ...
- [从源码学设计] Flume 之 memory channel
[从源码学设计] Flume 之 memory channel 目录 [从源码学设计] Flume 之 memory channel 0x00 摘要 0x01 业务范畴 1.1 用途和特点 1.2 C ...
- 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考
本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...
- flume的配置详解
Flume:===================== Flume是一种分布式的.可靠的.可用的服务,可以有效地收集.聚合和移动大量的日志数据. 它有一个基于流数据的简单而灵活的体系结构. 它具有健壮 ...
- 关于flume配置加载(二)
为什么翻flume的代码,一方面是确实遇到了问题,另一方面是想翻一下flume的源码,看看有什么收获,现在收获还谈不上,因为要继续总结.不够已经够解决问题了,而且确实有好的代码,后续会继续慢慢分享,这 ...
- Flume的安装与配置
Flume的安装与配置 一. 资源下载 资源地址:http://flume.apache.org/download.html 程序地址:http://apache.fayea.com/fl ...
随机推荐
- [Oracle]配置path使oracle备份/导入数据命令exp/imp起作用
将E:\Oracle11g\app\Administrator\product\11.2.0\dbhome_1\bin;路径添加如path
- Firefox 设置技巧
在Firefox地址栏中输入“about:cache”并键入回车,接着将显示Firefox的内存缓冲设置与磁盘高速缓存设置.如果在页面上单击“List Cache Entries”链接,我们还可以查看 ...
- (C++)STL排序函数sort和qsort的用法与区别
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...
- Jdk和Jre目录和三个lib目录说明----外部扩展jar包servlet,mysql,oracle等
以下文章转载自a personal blog:For Future,因为昨天下午在cmd模式下编译servlet失败,后来在网上找到这篇文章帮我解决了该问题,我觉得挺值得收藏的,并且这篇文章对&quo ...
- Java常见排序算法之归并排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- Codeforces Gym 100531D Digits 暴力
Problem D. Digits 题目连接: http://codeforces.com/gym/100531/attachments Description Little Petya likes ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...
- Visual Studio原生开发的10个调试技巧(一)
最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其 ...
- linux下的文件操作——批量重命名
概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...
- Qt Quick实现的涂鸦程序
之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...