微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

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

Flume aide_941 25℃

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,而且可以解决我们的问题!

如下给出一个案例:

  1. #### defind agent
  2. Agent.sources=execSources
  3. Agent.channels=fileChannel
  4. Agent.sinks=hdfsSinks
  5. #### defind sources
  6. Agent.sources.execSources.type=exec
  7. Agent.sources.execSources.channels=fileChannel
  8. Agent.sources.execSources.command=tail -f /opt/sink.log
  9. #### defind file channels
  10. Agent.channels.fileChannel.type=file
  11. Agent.channels.fileChannel.checkpointDir=/opt/cdh5/flume-1.5.0-cdh5.3.6/tmp/checkpointDir
  12. Agent.channels.fileChannel.dataDirs=/opt/cdh5/flume-1.5.0-cdh5.3.6/tmp/dataDirs
  13. #### defind hdfs sink
  14. Agent.sinks.hdfsSinks.type=hdfs
  15. Agent.sinks.hdfsSinks.channel=fileChannel
  16. Agent.sinks.hdfsSinks.hdfs.path=hdfs://bigdata-03:8020/user/flume/efdlogs/%Y-%m/%d
  17. Agent.sinks.hdfsSinks.hdfs.useLocalTimeStamp=true
  18. Agent.sinks.hdfsSinks.hdfs.writeFormat=Text
  19. Agent.sinks.hdfsSinks.hdfs.fileType=DataStream
  20. Agent.sinks.hdfsSinks.hdfs.filePrefix=sink-log
  21. Agent.sinks.hdfsSinks.hdfs.inUseSuffix=.tmp
  22. Agent.sinks.hdfsSinks.hdfs.rollSize=1024000
  23. Agent.sinks.hdfsSinks.hdfs.rollInterval=0
  24. 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就可以成功的话,可以看看这篇文章带大家看的源码!!!

万分感谢那些愿意分享经验的大神们,小弟学习了!

转载请注明:SuperIT » Flume的hdfsSink的roll参数不生效的原因(日志上传hdfs)

喜欢 (0)or分享 (0)