文章目录
Hadoop系列文章
Hadoop系列 (一):在CentOS中搭建hadoop环境(伪分布式)
Hadoop系列 (二):完全分布式搭建(腾讯云服务器+阿里云服务器)
概述
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。
Flume的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目的地(sink)。
为了保证输送的过程一定成功,在送到目的地(sink)之前,会先缓存数据(channel),待数据真正到达目的地(sink)后,flume在删除自己缓存的数据。
应用场景
Flume支持定制各类数据发送方,用于收集各类型数据;同时,Flume支持定制各种数据接受方,用于最终存储数据。一般的采集需求,通过对flume的简单配置即可实现。针对特殊场景也具备良好的自定义扩展能力。因此,flume可以适用于大部分的日常数据采集场景。
运行机制
Flume系统中核心的角色是Agent,Agent本身是一个Java进程,一般运行在日志收集节点。
Event是Flume定义的一个数据流传输的最小单元。Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。
一个完整Agent必须包含三个组件Source、Channel和Sink。
Source:采集源,用于跟数据源对接,以获取数据。
Channel:是一个数据的缓冲池,Agent内部的数据传输通道,用于从Source将数据传递到sink。
Sink:定义了数据输出的方式和目的地。采集数据的传送目的,用于往下一级Agent传递数据或者往最终存储系统传递数据。
这三个组件是必须有的,另外还有很多可选的组件interceptor、channel selector、sink processor
等。
在整个数据的传输的过程中,流动的是Event,它是Flume内部数据传输的最基本单元。
一个完整的Event包括:event headers、event body、event
信息,其中Event信息就是Flume收集到的日记记录。
整个流程大概如下:
1. Source接收由外部(如Web服务器)传递给它的Event。然后以Flume Source识别的格式向向Flume发送Event。接收的Event数据可以是任何语言,只要符合协议即可。
2. 当Source接收Event时,将其存储到一个或多个Channel。Channel是一个被动的存储器,用于存储Event,直至被Sink接收。
3. Sink从Channel中移除Event并将其放入外部存储(如HDFS,通过Flume的HDFS Sink实现),或将其转发到数据流中下一个Flume Agent的 Flume Source。
简单结构
采用单个Agent采集数据
复杂结构
多个Agent之间串联
Flume设置多级Agent连接的方式传输Event数据,类似于负载均衡或多点备份的方式。
特性
可靠性
Event会在每个Agent的Channel上进行缓存,随后Event将会传递到流中的下一个Agent或目的地(比如HDFS)。
只有成功地发送到下一个Agent或目的地后Event才会从Channel中删除。这一步保证了Event数据流在Flume Agent中传输时端到端的可靠性。