一、Flume基础

1. Flume是什么

Flume是数据采集,日志收集的框架,通过分布式形式进行采集
Flume本质:可以高效从各个网站服务器中收集日志数据,并且存储到HDFS、hbase

2. Flume的功能

– 支持在日志系统中定制各类数据发送方,用于收集数据
– Flume提供对数据进行简单处理,并写到各种数据接收方(可定制)的能力

3. Flume数据源

Console、RPC、Text、Tail、Syslog、Exec等

4. Flume特性

Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。
Flume 可以采集文件,socket 数据包、文件、文件夹、kafka 等各种形式源数
据,又可以将采集到的数据输出到 HDFS 、hbase 、hive 、kafka 等众多外部存储系统中
对一般的采集需求,通过对 flume 的简单配置即可实现
Flume 针对特殊场景也具备良好的自定义扩展能力,因此,flume 可以适用于大
部分的日常数据采集场景
Flume 的管道是基于事务,保证了数据在传送和接收时的一致性.
Flume 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等。

二、Flume核心

1. Flume架构
1.1 Flume外部结构

flume读取mysql表 flume数据源_Source


数据发生器(如:facebook,twitter)产生的数据被单个的运行在数据发生器所在服务器上的

agent所收集,之后数据收容器从各个agent上汇集数据并将采集到的数据存入到HDFS或者

HBase中

1.2 Flume数据格式

flume读取mysql表 flume数据源_flume_02

Fliume事件
flume使用event使用event对象作为数据传递的格式,是内部数据传输的基本单元
两部分组成:通过一个转载数据的字节数组+一个可选头部构成

2. Flume Agent
2.1 Agent架构

flume读取mysql表 flume数据源_flume_03


Agent三个重要组件

source : 表示flume的数据源

• 一个Flume源

• 负责一个外部源(数据发生器),如一个web服务器传递给他的事件

• 该外部源将它的事件以Flume可以识别的格式发送到Flume中

• 当一个Flume源接收到一个事件时,其将通过一个或者多个通道存储该事件

channel: 存储池
• 通道:采用被动存储的形式,即通道会缓存该事件直到该事件被sink组件处理
• 所以Channel是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存
起来,直到它们被sinks消费掉,它在source和sink间起着桥梁的作用,channel是一个完整
的事务,这一点保证了数据在收发的时候的一致性. 并且它可以和任意数量的source和sink链接
• 可以通过参数设置event的最大个数
file: 保证数据不丢失,速度相对较慢
memory: 数据可能会丢失,速度较快

• Flume通常选择FileChannel,而不使用Memory Channel
– Memory Channel:内存存储事务,吞吐率极高,但存在丢数据风险
– File Channel:本地磁盘的事务实现模式,保证数据不会丢失(WAL实现)write ahead log
Channel可靠性的体现:
当数据传输完成之后,该event才从通道中进行移除–(可靠性)

sink: 将event传输到外部介质
Sink会将事件从Channel中移除,并将事件放置到外部数据介质上
– 例如:通过Flume HDFS Sink将数据放置到HDFS中,或者放置到下一个Flume的Source,等到
下一个Flume处理。
– 对于缓存在通道中的事件,Source和Sink采用异步处理的方式
• Sink成功取出Event后,将Event从Channel中移除
• Sink必须作用于一个确切的Channel
sink的不同类型
– 存储Event到最终目的的终端:HDFS、Hbase
– 自动消耗:Null Sink
– 用于Agent之间通信:Avro

2.2 Agent的其他组件

Agent Interceptor(拦截器)

flume读取mysql表 flume数据源_数据_04


• Interceptor用于Source的一组拦截器,按照预设的顺序必要地方对events进行过滤和自定义的

处理逻辑实现

• 在app(应用程序日志)和 source 之间的,对app日志进行拦截处理的。也即在日志进入到source之前,对日志进行一些包装、清新过滤等等动作

flume的拦截器也是chain形式的,可以对一个source指定多个拦截器,按先后顺序依次处理

3. Flume可靠性

可靠性
• Flume保证单次跳转可靠性的方式:传送完成后,该事件才会从通道中移除
• Flume使用事务性的方法来保证事件交互的可靠性。
• 整个处理过程中,如果因为网络中断或者其他原因,在某一步被迫结束了,这个数据会在下一次重新传输。
• Flume可靠性还体现在数据可暂存上面,当目标不可访问后,数据会暂存在Channel中,等目标可访问之后,再
进行传输
• Source和Sink封装在一个事务的存储和检索中,即事件的放置或者提供由一个事务通过通道来分别提供。这保证
了事件集在流中可靠地进行端到端的传递。
– Sink开启事务
– Sink从Channel中获取数据
– Sink把数据传给另一个Flume Agent的Source中
– Source开启事务
– Source把数据传给Channel
– Source关闭事务
– Sink关闭事务

三、 Flume复杂流

1. 单个Agent

flume读取mysql表 flume数据源_HDFS_05


Event是Flume定义的一个数据流传输的最小单元。Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。

Source消耗由外部(如Web服务器)传递给它的Event。外部以Flume Source识别的格式向Flume发送Event。例如,Avro Flume Source可接收从Avro客户端(或其他FlumeSink)接收Avro Event。用Thrift Flume Source也可以实现类似的流程,接收的Event数据可以是任何语言编写的只要符合Thrift协议即可。

当Source接收Event时,它将其存储到一个或多个channel。该channel是一个被动存储器,可以保持Event直到它被Sink消耗。『文件channel』就是一个例子 - 它由本地文件系统支持。sink从channel中移除Event并将其放入外部存储库(如HDFS,通过 Flume的 HDFS Sink 实现)或将其转发到流中下一个Flume Agent(下一跳)的Flume Source。

Agent中的source和sink与channel存取Event是异步的。

Flume的Source负责消费外部传递给它的数据(比如web服务器的日志)。外部的数据生产方以Flume Source识别的格式向Flume发送Event。

2. Flume多级Agent连接

flume读取mysql表 flume数据源_flume_06


这就是一个扇入方式的Flume部署方式,前三个Agent的数据都汇总到一个Agent4上,最后由Agent4统一存储到HDFS。

Event会在每个Agent的Channel上进行缓存,随后Event将会传递到流中的下一个Agent或目的地(比如HDFS)。只有成功地发送到下一个Agent或目的地后Event才会从Channel中删除。这一步保证了Event数据流在Flume Agent中传输时端到端的可靠性。