Flume的hdfsSink的roll参数不生效的原因(日志上传hdfs)
首先,本人菜鸡一个,只是分享点东西出来,怕自己忘了,也给各位大佬填填坑当当垫背的!
事情是这样的:
测试:
通过exec作为一个源,将tail -f /opt/20171130.log这样命令接收到的数据上传到HDFS
先给个官网路径:http://flume.apache.org/FlumeUserGuide.html
在官网这个页面上,直接Ctrl+F,搜索hdfs,就可以看到关于hdfs的sink有哪些参数可以配置,如下图:
第一张图,这个是配置生成的路径的一些参数(大多数都是时间,比如生成的年月日时分秒之类的)
第二张图,就是hdfs的sink可以配置的相关参数(其实也要注意下版本,看看有没有新的一些可配置的参数)
这里的参数其实后面都有说明,百度翻译下应该是没有问题
有几个属性稍微记录下:
1、hdfs.fileType:hdfs上的文件类型,默认是二进制,如果想要原封不动的保留你的字符串类型的日志,那么使用DataStream,如果想要压缩的话,使用CompressedStream,但是如果使用了这个属性,记得要设置hdfs.codeC,指定一种压缩格式gzip, bzip2, lzo, lzop, snappy
2、各种roll属性:这些是用来这个flume保存在hdfs上的文件的大小的
首先说下,日志上传到hdfs,会先以tmp(临时)文件的形式保存到hdfs上,等到达到某些阈值才会变成正式的文件块
hdfs.rollInterval,30
hdfs.rollSize,1024
hdfs.rollCount,10
以上这几个值从三个维度来限定一个文件块的生成规则
首先是30s,
然后是1024byte(如果要1M一个文件,那就是1024000),
最后是10条events
他们遵从(0 = never roll based on time interval),就是说如果你不想让这个参数影响文件的生成的话,就设置为0,否则就是默认值。
其次其实如果你的副本数如果不为1的话,你会发现roll的配置不生效,是因为flume检测到hdfs文件块的复制,然后强制终结了这次的tmp临时文件,生成新的,所以就会发现,roll的参数不生效
解决方法:手动将hdfs.minBlockReplicas值设置为1,让flume感应不到hdfs文件块的复制,备份数还是3,而且可以解决我们的问题!
如下给出一个案例:
-
#### defind agent
-
Agent.sources=execSources
-
Agent.channels=fileChannel
-
Agent.sinks=hdfsSinks
-
-
-
#### defind sources
-
Agent.sources.execSources.type=exec
-
Agent.sources.execSources.channels=fileChannel
-
Agent.sources.execSources.command=tail -f /opt/sink.log
-
-
-
#### defind file channels
-
Agent.channels.fileChannel.type=file
-
Agent.channels.fileChannel.checkpointDir=/opt/cdh5/flume-1.5.0-cdh5.3.6/tmp/checkpointDir
-
Agent.channels.fileChannel.dataDirs=/opt/cdh5/flume-1.5.0-cdh5.3.6/tmp/dataDirs
-
-
-
#### defind hdfs sink
-
Agent.sinks.hdfsSinks.type=hdfs
-
Agent.sinks.hdfsSinks.channel=fileChannel
-
Agent.sinks.hdfsSinks.hdfs.path=hdfs://bigdata-03:8020/user/flume/efdlogs/%Y-%m/%d
-
Agent.sinks.hdfsSinks.hdfs.useLocalTimeStamp=true
-
Agent.sinks.hdfsSinks.hdfs.writeFormat=Text
-
Agent.sinks.hdfsSinks.hdfs.fileType=DataStream
-
Agent.sinks.hdfsSinks.hdfs.filePrefix=sink-log
-
Agent.sinks.hdfsSinks.hdfs.inUseSuffix=.tmp
-
Agent.sinks.hdfsSinks.hdfs.rollSize=1024000
-
Agent.sinks.hdfsSinks.hdfs.rollInterval=0
-
Agent.sinks.hdfsSinks.hdfs.rollCount=0
启动flume的命令:bin/flume-ng agent –name Agent –conf ./conf/ –conf-file ./conf/exec-file-hdfs.conf.p -Dflume.root.logger=INFO,console
然后我是写了个shell脚本循环往sink.log里面插入数据:
<span style="font-size:18px;">#!/bin/sh
i=0
while((i<10000))
do
echo "aalaansdlkanslabclkanslnclaksnuabcasjcbalsck" >> /opt/sink.log
i=$i+1
done</span>
好了,结果大概是这样,大家可以自己测试下这几个参数的结合使用:
但是时间不太准。。。。。所以凑合着看看好了
在这里也非常感谢,xuanxufeng这个博主所发的文章
(原文链接)http://www.aboutyun.com/thread-21365-1-1.html
如果大家想研究为什么设置成1就可以成功的话,可以看看这篇文章带大家看的源码!!!
万分感谢那些愿意分享经验的大神们,小弟学习了!