HttpSource -> File Roll Sink
FileRollSink 可以将source中的数据存如本地,但FileRollSink文件名不能自定义,而且不能定时滚动文件,只能按时间间隔滚动,可以自己定义sink,来做定时写文件,参考了 http://blog.csdn.net/tswisdom/article/details/41483471 这篇文章。
本文利用文件Sink,实现了按固定格式目录输出,收集完成结果存放需要按天生成文件夹,按每5分钟生成文件,比如2012年12月29日12点26分的日志,需要放到/data/flume_test/20121229/log-1225-对应的文件中。
配置文件
a1.sources=r1
a1.sinks=k1
a1.channels=c1
a1.sources.r1.type=http
a1.sources.r1.bind=localhost
a1.sources.r1.port=50000
a1.sources.r1.channels=c1
a1.sources.r1.handler=com.test.flume.PlainJSONHandler
a1.sources.r1.interceptors = i1 i2 logformat
a1.sources.r1.interceptors.i1.preserveExisting = true
a1.sources.r1.interceptors.i1.type = timestamp
a1.sources.r1.interceptors.i2.type = host
a1.sources.r1.interceptors.i2.hostHeader = hostname
a1.sources.r1.interceptors.logformat.type = com.test.flume.LogFormatInterceptor$Builder
a1.sinks.k1.channel=c1
a1.sinks.k1.type=com.test.flume.FileSink
#a1.sinks.k1.sink.directory=/data/flume_test2/
#a1.sinks.k1.sink.rollInterval = 3600
a1.sinks.k1.sink.batchSize=100
a1.sinks.k1.file.path = /data/flume_test2/%{dayStr}
a1.sinks.k1.file.filePrefix = log-%{hourStr}%{minStr}-
a1.sinks.k1.file.txnEventMax = 10000
a1.sinks.k1.file.maxOpenFiles = 5
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
注:拦截器 Interceptors 设置在Source 和Source 写入数据的Channel 之间,Source 接收到的事件在写入到对应的Channel之前,拦截器都可以转换或者删除这些事件,这里使用了三个 interceptor : i1, i2, logformat,
(1) i1 是一个Timestamp Interceptor,会在在event 的 header 里添加了 timestamp, preserveExisting 的 默认值是false,其作用是如果timestamp已经存在,应该被保护;
(2) i2 是一个 Host Interceptor,会在在event 的 header 里添加了 host, hostHeader 的默认值是host,是header的key名称, Host Interceptor( i2 ) 还有个属性为 useIP 默认值是true,使用ip,而非hostname;
(3) logformat 使用了自定义的 Interceptor, 主要为header 添加了{dayStr} {hourStr} {minStr} 以供 后面的sink使用
Code