Flume NG 学习笔记(一)简介

1、简介

Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各种数据发送方,用于收集数据;同时,Flume提供对数据的简单处理,并写到各类数据接收方的能力。node

Flume在0.9.x and 1.x之间有较大的架构调整,1.x版本以后的改称Flume NG(next generation),0.9.x的称为Flume OG(originalgeneration)。mysql

对于OG版本, Flume NG (1.x.x)的主要变化以下:linux

一、sources和sinks 使用channels进行连接sql

二、两个主要channel 。1) in-memorychannel  非持久性支持,速度快。2)JDBC-based channel 持久性支持。数据库

三、再也不区分逻辑和物理node,全部物理节点统称为 “agents”,每一个agents 都能运行0个或多个sources 和sinks数组

四、再也不须要master节点和对zookeeper的依赖,配置文件简单化。缓存

五、插件化,一部分面对用户,工具或系统开发人员。服务器

六、使用Thrift、Avro Flume sources 能够从Flume0.9.4 发送 events  到Flume 1.x架构

下图为Flume体系架构分布式

其中相关组件以下:

组件

功能

Agent

使用JVM 运行Flume。每台机器运行一个agent,可是能够在一个agent中包含多个sources和sinks。

Client

生产数据,运行在一个独立的线程。

Source

从Client收集数据,传递给Channel。

Sink

从Channel收集数据,运行在一个独立线程。

Channel

链接 sources 和 sinks ,这个有点像一个队列。

Events

能够是日志记录、 avro 对象等。

 

Flume架构总体上看就是 source-->channel-->sink 的三层架构,相似生成者和消费者的架构,他们之间经过channel传输,解耦。

Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成,注:运行Flume时,机器必须安装装JDK6.0以上的版本

事件是Flume的基本数据单位,它携带日志数据(字节数组形式)而且携带有头信息,这些Event由Agent外数据源生成

当Source捕获事件后会进行特定的格式化,而后Source会把事件推入(单个或多个)Channel中。你能够把Channel看做是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另外一个Source。

Flume支持用户创建多级流,也就是说,多个agent能够协同工做


 

2、Flume Source

FlumeSource :完成对日志数据的收集,分红transtion 和event 打入到channel之中。

Flume提供了各类source的实现,包括Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source,etc。

对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本能够实现无缝接入,不须要对现有程序进行任何改动。直接读取文件Source,有两种方式:

一、Exec Source 以运行Linux命令的方式,持续的输出最新的数据,如tail -F 文件名指令,在这种方式下,取的文件名必须是指定的。

ExecSource 虽然支持实时数据,可是在flume不运行和脚本错误时,会丢数据,也不支持断点续传功能。由于没有记录上次文件读到的位置,从而没办法知道,下次再读时,从什么地方开始读。特别是在日志文件一直在增长的时候。flume的source挂了。等flume的source再次开启的这段时间内,增长的日志内容,就没办法被source读取到了。不过flume有一个execStream的扩展,能够本身写一个监控日志增长状况,把增长的日志,经过本身写的工具把增长的内容,传送给flume的node。再传送给sink的node。要是能在tail类的source中能支持,在node挂掉这段时间的内容,等下次node开启后在继续传送,那就更完美了。

 

二、Spool Source是监测配置的目录下新增的文件,并将文件中的数据读取出来。其中,SpoolSource有2个注意地方,第一个是拷贝到spool目录下的文件不能够再打开编辑,第二个是spool目录下不可包含相应的子目录。

SpoolSource在实际使用的过程当中,能够结合log4j使用,使用log4j的时候,将log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。 log4j有一个TimeRolling的插件,能够把log4j分割的文件到spool目录。基本实现了实时的监控。Flume在传完文件以后,将会修 改文件的后缀,变为.COMPLETED(后缀也能够在配置文件中灵活指定)

Exec Source 和Spool Source 比较

    1)、ExecSource能够实现对日志的实时收集,可是存在Flume不运行或者指令执行出错时,将没法收集到日志数据,没法何证日志数据的完整性。

    2)、SpoolSource虽然没法实现实时的收集数据,可是可使用以分钟的方式分割文件,趋近于实时。

3)、总结:若是应用没法实现以分钟切割日志文件的话,能够两种收集方式结合使用。2、Flume Sink

FlumeSink取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。

Flume也提供了各类sink的实现,包括HDFS sink、Loggersink、Avro sink、File Roll sink、Null sink、Hbasesink,etc。

 

3、Flume Channel

FlumeChannel主要提供一个队列的功能,对source提供中的数据进行简单的缓存。

Flume对于Channel,则提供了Memory Channel、JDBC Chanel、File Channel,etc。

其中:

MemoryChannel能够实现高速的吞吐,可是没法保证数据的完整性。

MemoryRecoverChannel在官方文档的建议上已经建义使用FileChannel来替换。

FileChannel保证数据的完整性与一致性,事件持久化在本地文件系统里(性能较差)。在具体配置不现的FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不一样的磁盘,以便提升效率.

相关文章
相关标签/搜索