什么是Flume?
Apache Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各种数据源发送给指定的数据接收方;同时Flume还提供简单的数据处理的方法。
Flume的三大组成
(1)source
完成数据的收集,分成 transtion和 event将数据传送到Channel;
Flume提供了丰富的数据收集方法的实现,如: AvroSource、Exce Source、Spooling Directory Source、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source等等;
如: Exce Source:以运行Linux命令的方式,持续的输出最新的数据,如tail -f文件名指令,在这种方式下,取出的文件名必须是指定的;
Spool Source:是监控配置目录下新增的文件,并将文件中的内容读取出来
(2)Sink
Sink的作用是取出Channel中的数据,推送到相应的文件或数据存储系统(如Kafka、Hadoop的HDFS)、数据库、或者提交到远程服务器;
Flume Sink也提供了各种sink的实现,包括HDFS sink、Logger sink、Avro sink、File Roll sink、Null sink、HBase sink等等;
Flume Sink在设置存储数据时,可以向文件系统、数据库、Hadoop中存储数据,在日志数据较小时,可以将数据存储在文件中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后对数据进行分析。
(3)Channel
Flume Channel主要提供一个队列的能力,对Source中的数据进行简单的缓存;
Flume对Channel则提供了Memory Channel、JDBC Channel、File Channel;
Memory Channel:可以实现高吞吐量,但是无法保证数据的完整行;
File Channel:保证数据的完整性和一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录在不同磁盘,从而提高效率。
Flume的安装
(1)确保系统已经安装了JDK1.7+,并且配置了Java的环境变量;
(2)下载二进制安装包,地址:http://flume.apache.org/download.html
(3)创建Flume用户,上传Flume到用户目录,解压,重命名;
(4)复制flume-env.sh.template到flume-env.sh,复制flume-conf.properties.template到flume-conf.properties
Flume数据收集测试
利用netcat,发送数据,测试flume是否能收到数据:
Flume的配置如下:
agent.sources = r1
agent.channels = memoryChannel
agent.sinks = k1
# For each one of the sources, the type is defined
agent.sources.r1.type = netcat
agent.sources.r1.bind = localhost
agent.sources.r1.port = 8888
agent.sources.r1.channels = memoryChannel
# Each sink‘s type must be defined
agent.sinks.k1.type = logger #sink的type是logger,收集的数据会进行日志打印
agent.sinks.k1.channel = memoryChannel
# Each channel‘s type is defined.
agent.channels.memoryChannel.type = memory
agent.channels.memoryChannel.capacity = 100
agent.channels.transactionCapacity = 100
从配置文件可以看出,此处的flume代理的名字是agent,采集的数据类型是 localhost 的netcat,端口是8888,数据存储类型是内存存储。
启动flume:
flume-ng agent -n agent -c conf -f /home/flume/flume/conf/flume-conf.properties -Dflume.root.logger=INFO,console
同时利用netcat发送信息,我们看flume 的输出信息:
我们可以看到Flume成功收集到我们nc发送的信息。