您的位置:首页 > 运维架构

Flume的hdfsSink的roll参数不生效的原因(日志上传hdfs)

2017-11-30 15:51 495 查看
首先,本人菜鸡一个,只是分享点东西出来,怕自己忘了,也给各位大佬填填坑当当垫背的!

事情是这样的:

测试:

通过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里面插入数据:

#!/bin/sh
i=0
while((i<10000))
do
echo "aalaansdlkanslabclkanslnclaksnuabcasjcbalsck" >> /opt/sink.log
i=$i+1
done

好了,结果大概是这样,大家可以自己测试下这几个参数的结合使用:



但是时间不太准。。。。。所以凑合着看看好了



在这里也非常感谢,xuanxufeng这个博主所发的文章

(原文链接)http://www.aboutyun.com/thread-21365-1-1.html 

如果大家想研究为什么设置成1就可以成功的话,可以看看这篇文章带大家看的源码!!!

万分感谢那些愿意分享经验的大神们,小弟学习了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flume hadoop