在官网这个页面上,直接Ctrl+F,搜索hdfs,就可以看到关于hdfs的sink有哪些参数可以配置,如下图:

第一张图,这个是配置生成的路径的一些参数(大多数都是时间,比如生成的年月日时分秒之类的)

hadoop和flume搭建 flume hdfs sink_hadoop

第二张图,就是hdfs的sink可以配置的相关参数(其实也要注意下版本,看看有没有新的一些可配置的参数)

hadoop和flume搭建 flume hdfs sink_flume_02

这里的参数其实后面都有说明,百度翻译下应该是没有问题

有几个属性稍微记录下:

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



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


hadoop和flume搭建 flume hdfs sink_hadoop和flume搭建_03

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

hadoop和flume搭建 flume hdfs sink_hadoop_04