Flume是Cloudera提供的日志收集系统,具有分布式、高可靠、高可用性等特点,对海量日志采集、聚合和传输,Flume支持在日志系统中制定各类数据发送,同时,Flume提供对数据进行简单处理,并写到各种数接受方的能力。其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。

Flume的特征:可靠性,可扩展性,可管理性

接下来我们说的是Flume NG架构的优势:

1、NG 在核心组件上进行了大规模的调整

2、大大降低了对用户的要求,如用户无需搭建ZooKeeper集群

3、有利于 Flume 和其他技术、hadoop 周边组件的整合

4、在功能上更加强大、可扩展性更高

Flume的核心是把数据从数据源收集过来,在送到目的地,为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据
Flume传输的数据基本单位是Event,如果是文本文件,通常是一行记录,这也是事务的基本单位。Event从Source,流向Channel,再到Sink,本身为一个byte数组,并可携带headers信息。Event代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的地去
Flume运行的核心是Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,Event可以从一个地方流向另外一个地方。

 

Source可以接收外部源发送过来的数据,不同的source可以接受不同的数据格式。比如有目录池(spooling directory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容

Channel是一个存储地,接收source的输出,直到sink消费掉channel中的数据。channel中的数据直到进入到下一个channel中或者进入终端才会被删除。当sink写入失败后,可以自动重启,不会造成数据丢失,因此很可靠

Sink会消费channel中的数据,然后送给外部源或者其他source。如数据可以写入到HDFS或者HBase中。

Flume允许多个agent连在一起,形成前后相连的多级跳:

Flume架构核心组件:

source:source负责接收event或通过特殊机制产生event,并将events批量的放到一个或多个channel,source必须至少和一个channel关联

不同类型的source:与系统集成的source: Syslog, Netcat;直接读取文件的 source: ExecSource、SpoolSource;用于Agent和Agent之间通信的IPC Source: Avro、Thrift

channel:channel位于source和sink之间,用于缓存进来的event。当Sink成功的将event发送到下一跳的channel或最终目的时候,event从Channel移除。

几种channel类型:MemoryChannel 可以实现高速的吞吐,但是无法保证数据的完整性;FileChannel(磁盘channel)保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率

sink:Sink负责将event传输到下一跳或最终目的;sink在设置存储数据时,可以向文件系统、数据库、Hadoop存数据,在日志数据较少时,可以将数据存储在文件系统中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到hadoop中,便于日后进行相应的数据分析。必须作用于一个确切的channel

下载源码包:http://mirror.bit.edu.cn/apache/flume/1.6.0/

1、安装软件包:

[lan@master ~]$ tar -xvf apache-flume-1.6.0-bin.tar.gz
[lan@master ~]$ tar -xvf apache-flume-1.6.0-src.tar.gz

2、将源码合并至安装目录apache-flume-1.6.0-bin下

配置环境变量:

[lan@master ~]$ vim ~/.bash_profile 

export FLUME_HOME=/home/lan/apache-flume-1.6.0-bin/
export PATH=$PATH:$FLUME_HOME/bin

测试flume-ng是否安装成功:

flume-ng version

3、

新建一个flume代理agent1的配置文件example.conf
[lan@master ~]$ cd apache-flume-1.6.0-bin/conf/
[lan@master conf]$ vim example.conf

#agent1
agent1.sources = source1
agent1.sinks = sink1
agent1.channels = c1

#source1
agent1.sources.source1.type = spooldir
agent1.sources.source1.spoolDir = /home/lan/agent1log
agent1.sources.source1.channels = c1
agent1.sources.source1.fileHeader = false

#sink1
agent1.sinks.sink1.type = hdfs
agent1.sinks.sink1.hdfs.path = hdfs://master:9000/agentlog
agent1.sinks.sink1.hdfs.fileType = DataStream
agent1.sinks.sink1.hdfs.writeFormat = TEXT
agent1.sinks.sink1.hdfs.rollInteval = 4
agent1.sinks.sink1.channel = c1

#channel1
agent1.channels.c1.type = file
agent1.channels.c1.checkpointDir = /home/lan/agent1_tmp1
agent1.channels.c1.dataDirs = /home/lan/agent1_tmpdata
#agent1.channels.channel1.capacity = 10000
#agent1.channels.channel.transactionCapacity = 1000

新建agent1log:

[lan@master ~]$ mkdir agent1log

[lan@master ~]$ cd apache-flume-1.6.0-bin

[lan@master apache-flume-1.6.0-bin]$ flume-ng agent -n agent1 -c conf -f /home/lan/apache-flume-1.6.0-bin/conf/example.conf -Dflume.root.logger=DEBUG,console

另启一个terminal,在监测目录下创建新的文件test2.txt
cd ~/agent1log
vim test2.txt

查看sink1的输出,发现目标路径下有一个以FlumeData开始,产生文件的时间戳为后缀的文件,说明flume能监测到目标目录变化,将产生变化的部分实时地收集到sink的输出中。