一、Flume定义
Flume是Cloudera提供的一个高可用的、高可靠的,分布式的海量日志采集、聚合和传输的系统。
Flume基于流式架构,灵活简单。
Flume最主要的作用就是,实时读取服务器本地磁盘的数据,将数据写入HDFS中。
二、Flume组成架构
1.Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的,
是Flume数据传输的基本单元。其主要有三个部分:Source、Channel、Sink。
2.Source
Source是负责接收数据到Flume Agent的组件。Source组件可以
处理各种类型、各种格式的日志数据,包括avro、thrift、exec、
jms、spooling directory、netcat、sequence generator、
syslog、http、legacy。
Put事务流程:
doPut:将批数据先写入临时缓冲区putList。
doCommit:检查channel内存队列是否足够合并。
doRollback:channel内存队列空间不足,回滚数据。
3.Channel
Channel是位于source和sink之间的缓冲区。
Flume自带两种Channel:MEmory Channel 和 File Channel。
MemoryChannel是内存中的队列。MemoryChannel在不需要关心数据丢失的情景下适用。
FileChannel将所有事件写到磁盘。是Flume持久化的Channel,系统宕机不会丢失数据。
Take事务流程:
doTake:先将数据取到临时缓存区takeList。
doCommit:如果数据全部发送成功,则清除临时缓存区。
doRollback:数据发送过程中如果出现异常,rollback将临时
缓存区takeList的数据归还channel内存队列。
4.Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到
存储或索引系统、或者被发送到另一个Flume Agent。
sink是完全事务性的。Sink组件目的地包括hdfs(最常用)、logger、avro、thrift、
ipc、file、null、HBase、solr、自定义。
5.Event
传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地。
三、Flume拓扑机构
1.点对点
最简单的方式,两个flume,一个是source另一个是sink,中间有channel连接,
有点像链式结构,后面可以接着加节点。
2.多副本结构
特点是一个source,多个channel,而多个channel是同一内容,只不过后面sink不同。
这种场景类似,读取一个日志文件,一份要交给hadoop离线处理,一份相同的交给spark实时处理。
3.负载均衡
这种结构在大数据中经常使用,使用多个sink进行负载均衡。
4.聚合模式
这种模式的设计针对的是集群,比如:正常的大数据服务不可能是
单个服务器,几乎都是集群,那么每个集群都会产生日志文件,为了
将每个日志文件进行收集,就采用这种Flume Agent聚合模式。
四、Flume Agent内部原理
1.使用"source"接收事件。
2.使用"channel处理器"处理事件。
3.将事件传递给拦截器链。
4.将每个事件给"channel选择器"。
Channel Selectors有两种类型:
Replicating Channel Selector(default) 和 Multiplexing Channel Selector。
Replicating会将source过来的events发往所有channel;
而Multiplexing可以配置发往那些channel。
5.返回写入事件Channel列表。
6.根据Channel选择器的选择结果,将事件写入相应Channel。
7.Sink处理器选择其中一个Sink去获取Channel数据,并将获取数据写入到下一个阶段。