一、Flume基础架构
1、Agent
Agent是一个JVM进程,它以事件(Event)的形式将数据从源头送至目的。
Agent主要有3个部分组成,Source、Channel、Sink。
2、Event
Flume数据传输的基本单元,以Event的形式将数据从源头送至目的地。
Event由Header和Body两部分组成,Header用来存放该event的一些属性,为K-V结构,Body用来存放该条数据,形式为字节数组。
3、Interceptors
在source将event放入到channel之前,调用拦截器对event进行拦截和处理。
4、Channel Selectors
一个source对接多个channel时,channel selector选择channel将event存入。replicating(默认):source会将event在每个channel都复制一份。
向可选的channel写入event时,即便发生异常,也会忽略。multiplexing:根据event header中的属性,参考用户自己配置的映射信息,将event发送到指定的channel。
5、Sink Processors:
多个sink从一个channel中取数据,Sink Processors从中挑选一个sink来取数据DefaultSinkProcessor:如果Agent中只有一个sink,默认使用DefaultSinkProcessor,如果有多个sink,多个sink对接一个channel,不能使用DefaultSinkProcessor。
LoadBalancingSinkProcessor对应的是Sink Group,可以实现负载均衡的功能,维护了sink组中active的sink,使用round_robin或random算法,来分散sink组中存活的sink之间的负载。
FailoverSinkProcessor对应的是Sink Group,可以实现故障转移的功能,维护了一个多个sink的优先级列表,按照优先级保证至少有一个sink是可以干活的,如果优先级高的sink故障了会被转移到故障池中冷却,冷却时故障的sink会尝试发送event,一旦发送成功就会移动到存活的池中。
二、Flume常用source:
1、SpoolingDirSource:
监控目录,读取目录中新增的文件,将文件的内容封装为event。
2、TailDirSource:
目前只能监控文件,读取多个文件最新追加写入的内容。
不会丢数据(可靠的)即使flume出现了故障或挂掉。
Taildir Source在工作时,会将读取文件的最后的位置记录在一个json文件中,一旦agent重启,会从之前已经记录的位置,继续执行tail操作。
Json文件中位置是可以修改,修改后,Taildir Source会从修改的位置进行tail操作。
如果JSON文件丢失了,此时会重新从每个文件的第一行重新读取,这会造成数据的重复。
常见问题:
TailDirSource采集的文件,不能随意重命名。
如果日志正在写入时,名称为 xxxx.tmp,写入完成后改名为xxx.log,此时一旦匹配规则可以匹配上述名称,就会发生数据的重复采集。
三、自定义Interceptor
点赞、评论、浏览等不同类型的日志需要发送到不同的分析系统。此时会用到Flume拓扑结构中的Multiplexing结构,Multiplexing的原理是,根据event中Header的某个key的值,将不同的event发送到不同的Channel。
定义一个Interceptor,根据event中body的类型,为不同类型的event的Header中的key赋予不同的值。
四、Flume参数调优
1、source:
batchSize:source一次批量运输到Channel的event条数
2、channel
①type:memory:channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据。
file:channel的容错性更好,但是性能上会比memory channel差。
②capacity:channel可容纳最大的event条数
③transactionCapacity:每次Source往channel里面写的最大event条数和每次Sink从channel里面读的最大event条数
3、sink
batchSize:Sink一次批量从Channel读取的event条数,适当调大这个参数可以提高Sink从Channel搬出event的性能。
五、Flume事务机制
六、Flume采集数据会丢失吗?
生产环境中使用TailDirSource + FileChannel 所有没有出现丢数据的情况。
根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事务机制,Source到Channel是事务性的,Channel到Sink是事务性的,因此这两个环节不会出现数据的丢失。
唯一可能丢失数据的情况是Channel采用memoryChannel,agent宕机导致数据丢失。
Flume不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由Sink发出,但是没有接收到响应,Sink会再次发送数据,此时可能会导致数据的重复。