介绍了flume的基本原理和使用
简介
Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和传输大量日志数据,是基于流式的简单灵活的架构。
它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错性。
它使用简单的可扩展数据模型,允许在线分析应用程序。
流程图
六大组件
3大基本组件,3个辅助组件。这些组件都支持用户自定义。
Source
用于数据的收集。将数据捕获后可以先进行自定义处理,然后将数据封装到事件(event) 里(如event的body),最后将事件推入Channel中。
常见的source:
Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source 等等。
Channel
用于连接Source和Sink的组件,是数据的缓冲区。它可以将事件暂存到内存中也可以持久化到本地磁盘上, 直到Sink处理完该事件。
常见的channel:
Memory Channel、File Channel、Kafka Channel等等。
Sink
从channel中取出数据,再将数据存入相应的存储文件系统,数据库,或者提交到远程服务器。
常见的sink:
HDFS sink、Logger sink、Avro sink、File Roll sink、Null sink、HBase sink 等等。
Interceptor
对Source收集的数据,进行分类或者拦截。可以将多个Interceptor连接形成拦截器链。
用法
-
分类:自定义分类逻辑,将分类属性(k,v类型),加入event的headers中,然后使用MultiplexingChannelSelector选择器 选择放入哪个channel中。
-
拦截:自定义丢弃逻辑,将不要的event设为null即可。
ChannelSelector
将event放入指定的channel中。
2种ChannelSelector:
-
ReplicatingChannelSelector(默认) :将事件放入所有channel中。(用于复制,也就是备份)
-
MultiplexingChannelSelector :结合Interceptor使用。根据header,将event放到指定的channel中。
sinkgroups中的SinkProcessor
按照指定算法将event分配到sink组的sink中。需要先指定一个sink组,再选择SinkProcessor,它会根据配置的分配方式自动将event分到组里的sink中。注意默认的SinkProcessor中,没有sink组的概念,不需要配置,也就是一对一。
2种SinkProcessor:
-
LoadBalanceSinkProcessor :负载均衡。可选择分配方式:如随机分配、轮询分配等等
-
FailoverSinkProcessor :优先级分配(多用于故障转移)。指定sink的优先级,按优先级分配。
两个Transaction
Put Transaction
它实现 source 将 event 发送至 channel,带有容错机制,可以分为以下阶段:
- doPut: 将批数据写入临时缓冲区putList
- doCommit: 检查channel内存队列是否足够合并。
- doRollback: channel内存队列空间不足,回滚数据
Take Transaction
它实现 sink 将 event 从 channel 中提取出来,带有容错机制,可以分为以下阶段:
- doTake: 将数据提取到临时缓冲区takeList
- doCommit: 数据发送成功的前提下,清除临时缓冲区takeList
- doRollback: 数据发送过程中如果出现异常,rollback将临时缓冲区takeList中的数据归还给channel内存队列。
一些案例
- 日志复制(备份)
单source,多channel,多sink
使用 ReplicatingChannelSelector,将每个event分到多个channel再传到sink中,实现复制(备份)。
- 日志分类
单source,多channel,多sink, 配置拦截器
使用 MultiplexingChannelSelector,根据拦截器将每个event,分到指定的channel中再传到sink中,实现分类。
- 负载均衡
单source,单channel,多sink(组成一个sink组)
使用LoadBalanceSinkProcessor,选择分配方式:如随机分配、轮询分配,将event递给相应sink。
- 故障转移
单source,单channel,多sink(组成一个sink组)
使用FailoverSinkProcessor,给sink组里的sink指定优先级,只有优先级最高的会接收,当它挂了,次优先级的才会接收。
- 日志聚合
多source,单channel,单sink
直接将多个源的数据,用一个channel接收。
- 可以使用第三方框架Ganglia对flume实现监控