Flume Agent 内部原理

Source

Source是Flume的数据来源,来源的类型多样化,可以是监听一个文件的变化、一个文件夹的变化,可以是接收JMS消息,或者是监听一个网络端口等。Source至少要连接一个Channel,但是Event写入Channel不是由Source来完成的,每个Source都有自己的Channel处理器,Source每次写Event到Channel时,都由Channel处理器来完成。

Source

1、Source收集数据
2、Source收集到数据后,交给Channel处理器
3、Channel处理器将事件传给Source配置的一个或者多个拦截器,拦截器处理完事件后,返回Channel列表

拦截器是一段代码,可以基于某些它完成的处理来读取事件或者修改和删除事件。如同正则表达式。每个Source可以配置多个拦截器,按照配置中定义的顺序被调用,将拦截器的结果传递给链的下一个单元,这就是所谓的责任链的设计模式。

4、再次传递给Channel选择器。
5、Channel选择器可以根据事件的具体应用,来决定每个事件必须写入到哪个Channel,以及哪些Channel时必需的或可选的。
6、将所有的事件写入必需的Source附属的Channel中。此时只有一个事务开启,对于每个Channel,所有事件都写为事务的一部分
7、利用可选Channel进行重复操作。

在写入必需的Channel时,如果失败,会抛出ChannelException,说明Source必须重试此事件,不会因为写入失败而忽略掉。写入成功的时候,处理器会向Source指示成功状态,表明写入成功,可以接收更多的事件。


Channel

1、Channel是位于Source和Sink之间的缓冲区。在配置正确的情况下,Channel可以保证Flume的数据不丢失。
2、Source从写入数据到一个或者多个Channel中,由一个或者多个Sink来拉取数据。一个Sink只能从一个Channel中读取数据,而多个Sink可以从同一个Channel中读取,一次可以来提高性能。
3、Channel允许Source和Sink运作在不同的速率上。
4、Channel允许多个Source和Sink在他们上面操作。Channel 可以关联多个 source, 如一个 source个 可以按照配置选择的将数据复制到各个管道,或者按照消息头自动分发到指定的管道,一个 channel 可以接多 个sink ,这个实现了同一份数据的多发发送池,实现了数据的复用及负载均衡等功能


Sink

Sink连续轮询各自的Channel来读取和删除事件(这个动作是Sink Runner激活的)。Sink将事件推送到下一个阶段,如果在推送的事件到达下一个阶段并保证了数据的安全性后,会向Channel提交事务通知,可以在Channel中删除这些事件。
Sink

多个 Sink 可以构成一个Sink组( SinkGroup)。一个 Sink处理器(Sink Processor) 负责从一个指定的 Sink Group 中激活一个 Sink。Sink Processor可以通过组中所有 Sink 实现负载均衡;也可以在一个 Sink 失败时转移到另一个。

Groups 配置可以实现 sink 的负载均衡和失败重试机制:

负载均衡示例:

a1.sinkgroups =g1
a1.sinkgroups.g1.sinks= k1 k2
a1.sinkgroups.g1.processor.type= load_balance
a1.sinkgroups.g1.processor.backoff= true
a1.sinkgroups.g1.processor.selector= random

失败重试机制:

a1.sinkgroups =g1
a1.sinkgroups.g1.sinks= k1 k2
a1.sinkgroups.g1.processor.type= failover
a1.sinkgroups.g1.processor.priority.k1= 5
a1.sinkgroups.g1.processor.priority.k2= 10
a1.sinkgroups.g1.processor.maxpenalty= 10000

没有更多推荐了,返回首页