Flume NG初次使用

时间:2021-11-19 03:07:44

一、什么是Flume NG

Flume是一个分布式、可靠、和高可用性的海量日志采集、聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据;同时Flume提供对数据的简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力

Flume的初始版本称为Flume OG,后来重构核心组件、核心配置及代码结构,重命名为Flume NG(Next Gerneration),Flume NG大大简化,比Flume OG更容易部署。

二、什么变化了

(1)还是存在sources和sinks,通过channels来连接

(2)channes是可插拔和耐久性要求。Flume NG附带内存中的快速通道,但非持续性事件交付和一个基于文件的持久事件传递的渠道。

(3)没有更多的逻辑和物理节点,物理节点代理可以运行更多的sources和sinks

(4)没有master和zookeeper的依赖,相反,Flume运行一个简单的基于文件的配置系统

(5)一切都是插件,可插入的组件包括channels、sources、sinks、interceptors(拦截器)、sink processors、even serializers

三、Flume一些核心概念

组件 功能
Agent 使用JVM运行Flume,每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks
Client 生产数据,运行在一个独立的进程
Source 从Client收集数据,传递给Channel
Sink 从Channel收集数据,运行在一个独立的进程
Channel 连接sources和sinks,这个有点像一个队列
Events 可以是日志记录、avro对象等

1、数据流模型

Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成,如下图:

Flume NG初次使用

Flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由 Agent外部的Source,比如上图中的Web Server生成。当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel 看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

很直白的设计,其中值得注意的是,Flume提供了大量内置的Source、Channel和Sink类型。不同类型的 Source,Channel和Sink可以*组合。组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等。

如果你以为Flume就这些能耐那就大错特错了。Flume支持用户建立多级流,也就是说,多个agent可以协同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes。如下图所示:

Flume NG初次使用

2、高可靠性

从单agent来看,Flume使用基于事务的数据传递方式来保证事件传递的可靠性。Source和Sink被封装进一个事务。事件被存放在Channel中直到该事件被处理,Channel中的事件才会被移除。这是Flume提供的点到点的可靠机制。

从多级流来看,前一个agent的sink和后一个agent的source同样有它们的事务来保障数据的可靠性。

3、可恢复性

还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。

四、整体架构介绍

1、ExecSource

可通过写Unix command的方式组织数据,最常用的就是tail -F [file]。

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

2、Spooling Directory Source

SpoolSource:是监测配置的目录下新增的文件,并将文件中的数据读取出来,可实现准实时。需要注意两点:1、拷贝到spool目录下的文件不可以再打开编辑。2、spool目录下不可包含相应的子目录。在实际使用的过程中,可以结合log4j使用,使用log4j的时候,将 log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。log4j有一个TimeRolling的插件,可以把log4j分割的文件到spool目录。基本实现了实时的监控。Flume在传完文件之后,将会修改文件的后缀,变为.COMPLETED(后缀也可以在配置文件中灵活指定) 

ExecSource,SpoolSource对比:ExecSource可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法收集到日志数据,无法何证日志数据的完整性。SpoolSource虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于实时。如果应用无法实现以分钟切割日志文件的话,可以两种收集方式结合使用。 

Channel有多种方式:有 MemoryChannel, JDBC Channel, MemoryRecoverChannel, FileChannel。MemoryChannel可以实现高速的吞吐,但是无法保证数据的完整性。MemoryRecoverChannel在官方文档的建议上已经建义使用FileChannel来替换。FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议 FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。 

Sink在设置存储数据时,可以向文件系统中,数据库中,hadoop中储数据,在日志数据较少时,可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后进行相应的数据分析。