Flume-ngFlume-ngFlume-ngFlume-ng的原理和使用1.介绍.......................................................................................................12.架构.......................................................................................................22.1数据流...........................................................................................22.2核心组件.......................................................................................42.2.1source.................................................................................42.2.2Channel...............................................................................52.2.3sink.....................................................................................62.3可靠性...........................................................................................62.4可恢复性.......................................................................................73.安装和使用...........................................................................................74.开发相关.............................................................................................104.1自定义source......................................................................114.2自定义sink..........................................................................134.3自定义拦截器.......................................................................174.4其他说明...............................................................................175.参考文档.............................................................................................171.1.1.1.介绍Flume是Cloudera提供的日志收集系统,具有分布式、高可靠、高可用性等特点,对海量日志采集、聚合和传输,Flume支持在日志系统中定制各类数据发送方,同时,Flume提供对数据进行简单处理,并写到各种数据接受方的能力。Flume使用java编写,其需要运行在Java1.6或更高版本之上。官方网站:用户文档:开发文档:架构2.12.12.12.1数据流数据流数据流数据流Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。Flume传输的数据的基本单位是Event,如果是文本文件,通常是一行记录,这也是事务的基本单位。Event从Source,流向Channel,再到Sink,本身为一个byte数组,并可携带headers信息。Event代表着一个数据流的最小完整单元,从外部数据源来,向外部的目的地去。Flume运行的核心是Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是source、channel、sink。通过这些组件,Event可以从一个地方流向另一个地方,如下图所示。source可以接收外部源发送过来的数据。不同的source,可以接受不同的数据格式。比如有目录池(spoolingdirectory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容。channel是一个存储地,接收source的输出,直到有sink消费掉channel中的数据。channel中的数据直到进入到下一个channel中或者进入终端才会被删除。当sink写入失败后,可以自动重启,不会造成数据丢失,因此很可靠。sink会消费channel中的数据,然后送给外部源或者其他source。如数据可以写入到HDFS或者HBase中。flume允许多个agent连在一起,形成前后相连的多级跳。2.22.22.22.2核心组件核心组件核心组件核心组件2.2.12.2.12.2.12.2.1sourcesourcesourcesourceClient端操作消费数据的来源,Flume支持Avro,log4j,syslog和httppost(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(后缀也可以在配置文件中灵活指定)。2.2.22.2.22.2.22.2.2ChannelChannelChannelChannel当前有几个channel可供选择,分别是MemoryChannel,JDBCChannel,FileChannel,PsuedoTransactionChannel。比较常见的是前三种channel。MemoryChannel可以实现高速的吞吐,但是无法保证数据的完整性。MemoryRecoverChannel在官方文档的建议上已经建义使用FileChannel来替换。FileChannel保证数据的完整性与一致性。在具体配置FileChannel时,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。FileChannel是一个持久化的隧道(channel),它持久化所有的事件,并将其存储到磁盘中。因此,即使Java虚拟机当掉,或者操作系统崩溃或重启,再或者事件没有在管道中成功地传递到下一个代理(agent),这一切都不会造成数据丢失。MemoryChannel是一个不稳定的隧道,其原因是由于它在内存中存储所有事件。如果java进程死掉,任何存储在内存的事件将会丢失。另外,内存的空间收到RAM大小的限制,而FileChannel这方面是它的优势,只要磁盘空间足够,它就可以将所有事件数据存储到磁盘上。2.2.32.2.32.2.32.2.3sinksinksinksinkSink在设置存储数据时,可以向文件系统、数据库、hadoop存数据,在日志数据较少时,可以将数据存储在文件系中,并且设定一定的时间间隔保存数据。在日志数据较多时,可以将相应的日志数据存储到Hadoop中,便于日后进行相应的数据分析.更多sink的内容可以参考官方手册。2.32.32.32.3可靠性可靠性可靠性可靠性Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。Flume使用事务性的方式保证传送Event整个过程的可靠性。Sink必须在Event被存入Channel后,或者,已经被传达到下一站agent里,又或者,已经被存入外部数据目的地之后,才能把Event从Channel中remove掉。这样数据流里的event无论是在一个agent里还是多个agent之间流转,都能保证可靠,因为以上的事务保证了event会被成功存储起来。而Channel的多种实现在可恢复性上有不同的保证。也保证了event不同程度的可靠性。比如Flume支持在本地保存一份文件channel作为备份,而memorychannel将event存在内存queue里,速度快,但丢失的话无法恢复。2.42.42.42.4可恢复性可恢复性可恢复性可恢复性还是靠Channel。推荐使用FileChannel,事件持久化在本地文件系统里(性能较差)。3.3.3.3.安装和使用Flume的rpm安装方式很简单,这里不做说明。示例1:avro数据源安装成功之后,在/etc/flume/conf目录创建f1.conf文件,内容如下:agent-1.channels.ch-1.type=memoryagent-1.sources.avro-source1.channels=ch-1agent-1.sources.avro-source1.type=avroagent-1.sources.avro-source1.bind=0.0.0.0agent-1.sources.avro-source1.port=41414agent-1.sources.avro-source1.threads=5agent-1.sinks.log