1.问题背景
- 通常我们使用flume和kafka集成,都是使用flume监控文件,会在配置source时的命令,例如:tail -F 文件名,这种方式依然会存在一个问题,当flume的agent进程由于各种原因挂掉一段时间之后,就会产生断点,无法续上之前传输的内容,只能从新开始.
2.解决方案:
(1)低版本flume
第一种方案,是在使用tail -F命令的地方修改(默认读取文件末尾的10行数据)
a1.sources.r2.command=
tail -n +$(tail -n1 /root/log) -F /root/data/nginx.log | awk 'ARGIND==1{i=$0;next}{i++;if($0~/^tail/){i=0};print $0;print i >> "/root/log";fflush("")}' /root/log
/root/data/nginx.log行号
/root/log记录每次读取的行号
(2)高版本flume使用tailDir Souce
flume1.6版本以后官方修改了断点续传的bug
- 解决原理就如同spark的检查点,设置taildir_position.json记录消费位置的文件,当agent宕机从启后首先读取taildir_position.json文件,这样子就可以接续上宕机前的数据采集.
a1.sources.s1.type = TAILDIR
a1.sources.s1.positionFile = /home/dev/flume/flume-1.8.0/log/taildir_position.json
a1.sources.s1.filegroups = f1
a1.sources.s1.filegroups.f1 = /home/dev/log/moercredit/logstash.log
a1.sources.s1.headers.f1.headerKey1 = aaa
a1.sources.s1.fileHeader = true