Flume
一、定义
Flume是一个高可用的,高可靠的,分布式海量日志采集、聚合和传输的系统
Flume基于流式架构,灵活简单
Flume最主要的作用就是,实时读取服务器本地磁盘的数据,将数据写入到HDFS中
二、组成架构
1 架构图
Tips:
数据流动是batch
Source端不是直接将数据传给Channel,而是将数据经过临时缓存(Transaction) 再传给Channel。从Source到Channel的数据传输方式是----put(推送事件),包含方法doPut,putList,doCommit
Put事务流程
●doPut:将批数据先写入临时缓冲区putList
●doCommit:检查channel内存队列是否足够合并
●doRollback:channel内存队列空间不足,回滚数据
同样的理论,Channel和sink也存在,数据传输的方式是take(拉取事件),包含方法doTake,takeList,doCommit
Take事务
●doTake:先将数据取到临时缓冲区takeList
●doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
●doRollback:数据发送过程中如果出现异常, rollback将临时缓冲区takeL ist中的数据归还给channel内存队列
2 组件
1)Agent
Agent是一个JVM进程,它以事件的形式将数据从源头送至目的,是Flume数据传输的基本单元
Agent主要有3个部分组成,Source、Channel、Sink
2) Source
Source是负责接收数据到Flume Agent的组件
Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy
3) Channel
Channel是位于Source和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上
Channel是线程安全的,可以同时处理几个Source的写入操作和几个Sink的读取操作
Flume自带两种Channel:Memory Channel和File Channel
Memory Channel是内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失
File Channel将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据
4) Sink
Sink不断地轮询Channel中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent
Sink是完全事务性的。在从Channel批量删除数据之前,每个Sink用Channel启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就利用Channel提交事务。事务一旦被提交,该Channel从自己的内部缓冲区删除事件
Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义
5) Event
传输单元,Flume数据传输的基本单元,以事件的形式将数据从源头送至目的地
3 拓扑图
三、Flume Agent内部原理
1 拦截器
数据在进入Channel前,可使用拦截器对数据进行调整,例如,编码格式,日志分类,压缩/非压缩等
在使用拦截器堆数据进行调整后,将数据发送给Channel选择器,由选择器选择发送方式
2 Channel选择器
Channel选择器(Channel Selectors) 有两种类型:
ReplicatingChannel Selector (default) 和 MultiplexingChannel Selector
Replicating 会将source过来的events发往所有Channel
Multiplexing 可以配置发往哪些Channel
四、Flume参数调优
1 Source
增加Source个数(使用Tair Dir Source时可增加FileGroups个数),可以增大Source的读取数据的能力
batchSize参数决定Source一次批量运输到Channel的event条数,适当调大这个参数可以提高搬运性能
2 Channel
type 选择memory时Channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据
type选择file时Channel的容错性更好,但是性能上会比memory channel差
使用file Channel时dataDirs配置多个不同盘下的目录可以提高性能
Capacity 参数决定Channel可容纳最大的event条数
transactionCapacity参数决定每次Source往channel里面写的最大event条数和每次Sink从channel里面读的最大event条数。
transactionCapacity需要大于Source和Sink的batchSize参数–缓存大小>一次发送数据条数
3 Sink
增加Sink的个数可以增加Sink消费event的能力。
Sink也不是越多越好够用就行,过多的Sink会占用系统资源,造成系统资源不必要的浪费
batchSize参数决定Sink一次批量从Channel读取的event条数,适当调大这个参数可以提高搬出性能
五、Flume自定义MySQLSource
官方提供的source类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些Source。如:实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架
详情在word文档
MySQLSource
官方提供的source类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些Source。如:实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架
详情在word文档