flume介绍html
flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各种数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各类数据接受方(好比文本、HDFS、Hbase等)的能力 。官方网站:http://flume.apache.org/java
flume架构web
Flume采用了分层架构:分别为agent,collector和storage。用户能够根据须要添加本身的的agent,collector或者storage。其中,agent和collector均有两部分组成:source和sink,source是数据来源,sink是数据去向。(大三层和小三层同样,也能够说flume分为source、channel和sink)数据库
Flume核心概念apache
大的方面:json
Agent使用JVM 运行Flume。每台机器运行一个agent,可是能够在一个agent中包含多个sources和sinks。Collector将多个agent的数据收集后加载到storage中。架构
Storage存储收集的数据。分布式
Client生产数据,运行在一个独立的线程。ide
小的方面:oop
Source从Client收集数据,传递给Channel。Flume组件详解
Source从Client收集数据,传递给Channel。
Client端操做消费数据的来源,Flume 支持 Avro,log4j,syslog 和 http post(body为json格式)。可让应用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也能够 写一个 Source,以 IPC 或 RPC 的方式接入本身的应用,Avro和 Thrift 均可以(分别有 NettyAvroRpcClient 和 ThriftRpcClient 实现了 RpcClient接口),其中 Avro 是默认的 RPC 协议。具体代码级别的 Client 端数据接入,能够参考官方手册。
对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本能够实现无缝接入,不须要对现有程序进行任何改动。
对于直接读取文件 Source,有两种方式:
ExecSource: 以运行 Linux 命令的方式,持续的输出最新的数据,如tail -F 文件名指令,在这种方式下,取的文件名必须是指定的。 ExecSource 能够实现对日志的实时收集,可是存在Flume不运行或者指令执行出错时,将没法收集到日志数据,没法保证日志数据的完整性。
SpoolSource: 监测配置的目录下新增的文件,并将文件中的数据读取出来。须要注意两点:拷贝到 spool 目录下的文件不能够再打开编辑;spool 目录下不可包含相应的子目录。
SpoolSource 虽然没法实现实时的收集数据,可是可使用以分钟的方式分割文件,趋近于实时。
若是应用没法实现以分钟切割日志文件的话, 能够两种收集方式结合使用。 在实际使用的过程当中,能够结合 log4j 使用,使用 log4j的时候,将 log4j 的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。
log4j 有一个 TimeRolling 的插件,能够把 log4j 分割文件到 spool 目录。基本实现了实时的监控。Flume 在传完文件以后,将会修改文件的后缀,变为 .COMPLETED(后缀也能够在配置文件中灵活指定)
Channel链接 sources 和 sinks ,这个有点像一个队列
当前有几个 channel 可供选择,分别是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比较常见的是前三种 channel。
MemoryChannel 能够实现高速的吞吐,可是没法保证数据的完整性。
MemoryRecoverChannel 在官方文档的建议上已经建义使用FileChannel来替换。
FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不一样的磁盘,以便提升效率。
File Channel 是一个持久化的隧道(channel),它持久化全部的事件,并将其存储到磁盘中。所以,即便 Java 虚拟机当掉,或者操做系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会形成数据丢失。Memory Channel 是一个不稳定的隧道,其缘由是因为它在内存中存储全部事件。若是 java 进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到 RAM大小的限制,而 File Channel 这方面是它的优点,只要磁盘空间足够,它就能够将全部事件数据存储到磁盘上。
Sink从Channel收集数据,运行在一个独立线程。
Sink在设置存储数据时,能够向文件系统、数据库、hadoop存数据,在日志数据较少时,能够将数据存储在文件系中,而且设定必定的时间间隔保存数据。在日志数据较多时,能够将相应的日志数据存储到Hadoop中,便于往后进行相应的数据分析. collectorSink("fsdir","fsfileprefix",rollmillis):collectorSink,数据经过collector汇聚以后发送到hdfs, fsdir 是hdfs目录,fsfileprefix为文件前缀码。