Flume Agent 内部原理
从Soure 到 Channel过程
首先,source将接收的数据,封装成一个个的事件(event), 在事件进入Channel之间,首先要先进去Channel Processor 来处理事件,(事件就是一个个的对象) 所以我们可以在它进去channel之间进行很多操作去处理event。
例如我们可以写一个事件拦截器链设置一定条件,如果传输来的事件,不符合我们的要求,可以直接pass掉,对当前事件的处理,到此结束。设置的拦截器都需要一个个走。
走完拦截器以后,要走Channel Selector (Channel选择器)因为我们可能有多个Channel,通过它就可以判断当前事件应该走向哪个Channel,或者所有Channel。默认Replicating Channel Selector(default)-- (replicating hdfs中代表副本),在这里表示,将相同事件发送给每一个Channel。Multiplexing Channel Selector 多路复用,需要配置event,header中的k-v,根据 header决定将event 发送到哪一个Channel中。
当source把数据封装成event以后,header中kv是空的,所以先经过拦截器,在拦截器中就可以给event加上header信息。之后再经过 Multiplexing channel selecot,就可以明白当前event应该进入哪个channel中去。
总结: 再event进入channel之前,可以先进入拦截器(可有可无,根据需求,自行设置)
再进入Channel选择器(必须,一定进入) 默认Replicating Channel Selector(default)
从Channel到Sink的过程
当event从Channel中出来以后,再进去sink之前,需要现有sink Processor处理,SinkProcessor 有三种。DeafultSinkProcessor 只支持一个sink,有多个sink的时候不可能用它。
如果有多个sink的时候,LoadBalancingSinkProcessor 负载均衡sink组,每一个sink处理的数据差不多,那么如何保证每个sink处理的event大致相同呢? 1.轮巡(一个一个的一次给) 2. random随机,event到每个sink的概率是相同的。
FailoverSinkProcessor故障转移sink组,当前事件只能给到一个sink,该sink变成active sink处于激活状态的sink(正在处理event),其他sink则处于standby状态。如过active sink发生故障,数据就会转移别的sink(通过设置优先级,不是zookeeper中投票机制)
Source >>> 拦截器(可选的) >>> Channel Selector >>> Channel >>> Sink Processor >>> Sink
Channel Selector,再多个Channel的情况下,选择将event给到哪一个Channel
hannel的情况下,选择将event给到哪一个Channel
Sink Processor,选者将channel中出来的event给到哪一个sink