浅谈flume工作原理
flume以agent为运行单位,agent实质上是一个java进程,不断将数据从一个地方(如日志文件)传递到另一个地方(比如hdfs)。
agent中传递数据的基本单位是事件(Event),Event结构很简单,就包含header和body,header是一个map,body是字节数组。主要组件有三个:
1.Source-用于从数据源获取数据,组装成为Event,传递给后序操作,数据源可以是任何格式的数据,内置数据源获取方式有Avro、RPC、exec等。
2.Channel-用于Source和Sink之间缓存Event,会将Source中传递过来的Event按照先后顺序缓存起来,等待Sink来读取Event,Sink处理完成后,会删除缓存中Event;有两种缓存方式:文件和内存。
3.Sink-从Channel中读取事件,并且存储到HDFS、HBase中,内置Sink有Avro(对应发送到AvroSource)、HBase、HDFS等。
就单个agent来说,功能相对薄弱,对于复杂数据收集过程,可多个agent形成多层拓扑网络。
agent之间利用AvroSink和AvroSource通信。
深入flume
实际上flume提供一些特殊的组件:拦截器、Channel选择器、Sink运行器、Sink组、Sink处理器
1.拦截器
顾名思义,可以用作数据格式转换,将在Source处理之后、写入Channel之前执行,多个拦截器可以组成拦截器链。
2.Channel选择器
一个source传递出来的Event可以写入到多个Channel之中,Channel选择器就是做这样一个功能。内置Channel选择器有两种:复制选择器(将Event复制写入多个channel,也就是说这些channel内容完全一致)、多路复用选择器(通过指定Event的header中某一key对应值,选择对应channel,对应关系是预先在配置文件中定义的)。
3.Sink运行器
每个sink组对应一个Sink运行器,用来运行sink组。
4.sink组
sink组中包含多个sink,但不能同时运行,一次只能运行一个sink,这是为了agent负载均衡考虑。
5.sink处理器
sink组会指定sink处理器,内置包括两种:Load-Balancing Sink处理器和FailOver Sink处理器。当sink运行失败,将会从其他Sink中挑选出一个,作为新的Sink运行,两者选择策略不同。前者sink执行失败后,会执行回退,回退时间过后,sink重新尝试,失败又回退,直到写成功。选择有两种方式:random(随机挑选)和round-robin(循环挑选,假设有四个sink 1,2,3,4,那么顺序就是1,2,3,4,1,…);后者是根据优先级挑选,必须等到前一个sink失败或成功,下一个才能上;假如sink1失败了,sink2接上,这时,sink1又恢复了,那么虽然sink1优先级高于sink2,sink1还是要等待sink2执行完或失败。