flume概述
Flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据的简单处理,并写到各种数据接收方的能力。
Flume主要由3个重要的组件构成:Source、Sink、Channel。
flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。
source可以接收外部源发送过来的数据。不同的source,可以接受不同的数据格式。比如有目录池(spooling directory)数据源,可以监控指定文件夹中的新文件变化,如果目录中有文件产生,就会立刻读取其内容。
channel是一个存储地,接收source的输出,直到有sink消费掉channel中的数据。channel中的数据直到进入到下一个channel中或者进入终端才会被删除。当sink写入失败后,可以自动重启,不会造成数据丢失,因此很可靠。
sink会消费channel中的数据,然后送给外部源或者其他source。如数据可以写入到HDFS或者HBase中。
flume允许多个agent连在一起,形成前后相连的多级跳。
flume配置
使用flume的核心是如何配置agent文件。agent的配置是一个普通文本文件,使用键值对形式存储配置信息,可以设置多个agent信息。配置的内容包括source、channel、sink等。组件source、channel、sink都有名称、类型和很多个性化的属性配置。
配置文件应该这么写
# list the sources, sinks and channels for the agent
示例:
Spooling DirectorySource为例
SpoolSource:是监测配置的目录下新增的文件,并将文件中的数据读取出来。需要注意两点:
1)拷贝到spool目录下的文件不可以再打开编辑。
2) spool目录下不可包含相应的子目录
agent1.sources =src1
agent1.sinks = sink1 sink2
agent1.channels = ch1 ch2
说明:agent1是代理名称,对应有source,名称是src1,;有两个sink,名称是sink1和sink2;有两个channel,名称是ch1和ch2
agent1.sources.src1.type= spooldir
说明:spooldir指源的类型,flume工程根据此字符串走入监控目录相关代码,进而启动线程(代码逻辑在flume-ng-core工程SpoolDirectorySource.java)
agent1.sources.src1.spoolDir = /root/data/logs
说明:所监控的目录/root/data/logs,目前只支持监控一个目录,如有业务中需监控两个或以上的目录,可修改ReliableSpoolingFileEventReader.java中私有构造器中相关代码或者配置两个或以上相同的源。
agent1.sources.src1.ignorePattern = .*\\.txt
说明:该配置项默认是(^$),官方解释:Regular expressionspecifying which files to ignore (skip)。如果配置就是过滤的文件,示例中就是所监控的目录下以.txt结尾的文件不进行处理,配置按照Java中正则表达式进行配置,代码中是调用Pattern.compile(ignorePattern)进行解析(ReliableSpoolingFileEventReader|line174),解析后在ReliableSpoolingFileEventReader.getNextFile()方法中与读取的文件名通过ignorePattern.matcher(fileName).matches()匹配,如果匹配到返回false,就过滤不处理。注意:往监控目录中写文件时不能写以点(.)开头的文件和自定义结尾名的文件。
agent1.sources.src1.deletePolicy = immediate
说明:处理后文件的删除策略,默认是never,不删除,处理后将文件重命名,默认在文件名追加.COMPLETED(可自定义配置),配置immediate就是立即删除。源代码中有延时(delay)删除策略,不过目前没有实现,来了句(implementdelay in the future)ReliableSpoolingFileEventReader|line334。
agent1.sources.src1.fileSuffix=.COMPLETED
说明:读取文件后默认给处理后文件追加的后缀名,默认的是(.COMPLETED),和deletePolicy= never配合使用
agent1.sources.src1.batchSize= 100
说明:批量读取文件的大小,不配置时默认是100
agent1.sources.src1.channels= ch1
agent1.sources.src1.channels= ch2
#配置memorychannel
agent1.channels.ch1.type = memory
agent1.channels.ch1.capacity = 10000
说明:capacity属性指通道容量
agent1.channels.ch1.transactionCapacity = 1000
说明:transactionCapacity属性指通道传输能力
agent1.channels.ch1.byteCapacityBufferPercentage = 20
agent1.channels.ch1.byteCapacity = 800000
#配置filechannel
agent1.channels.ch2.type = file
agent1.channels.ch2.checkpointDir =/root/flumechannel/checkpoint
agent1.channels.ch2.dataDirs =/root/flumechannel/data
#配置hdfssink
agent1.sinks.sink1.type = hdfs
agent1.sinks.sink1.channel = ch2
agent1.sinks.sink1.hdfs.path =hdfs://hadoop0:9000/flume/%Y-%m-%d/
agent1.sinks.sink1.hdfs.rollInterval=1
agent1.sinks.sink1.hdfs.fileType = DataStream
agent1.sinks.sink1.hdfs.writeFormat = Text
#配置hbasesink
#配置hbasesink2
agent1.sinks.sink2.type = hbase
agent1.sinks.sink2.channel = channel1
agent1.sinks.sink2.table = hmbbs
agent1.sinks.sink2.columnFamily = cf
agent1.sinks.sink2.serializer =flume.HmbbsHbaseEventSerializer
agent1.sinks.sink2.serializer.suffix = timestamp
agent1.sinks.sink2.serializer =org.apache.flume.sink.hbase.SimpleHbaseEventSerializer
启动代理的脚本
启动命令是flume-ng,命令在flume工程的bin目录下
-n指定agent名称
-c指定配置文件目录
-f指定配置文件
-Dflume.root.logger=INFO,console
因此完整命令:
bin/flume-ng agent -c conf -f conf/example.conf -n a1-Dflume.root.logger=INFO,console
官方配置指南:
http://flume.apache.org/FlumeUserGuide.html