比如我们想要通过Flume将数据输出到HDFS中,并且希望每个文件100K左右,可以这么设置sink属性
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
#目录名为/flume/小时-分钟/秒
a1.sinks.k1.hdfs.path = /flume/%H-%M/%S
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.hdfs.fileType = DataStream
#每1分钟目录滚动一次
a1.sinks.k1.hdfs.roundValue = 1
a1.sinks.k1.hdfs.roundUnit = minute
#文件滚动不依据时间或事件数
a1.sinks.k1.rollInterval = 0
a1.sinks.k1.rollCount = 0
#每100K滚动一次文件
a1.sinks.k1.rollSize = 102400
结果发现每15K就滚动一次,解决方案是加上一条属性
a1.sinks.k1.hdfs.minBlockReplicas = 1
hdfs.minBlockReplicas指的是flume允许的最小块副本数,默认为hdfs副本数(我的机器为3)。HDFS sink文件滚动时还会考虑是否正在进行块复制,设置为1可以让flume感知不到hdfs的块复制,从而不发生滚动
我个人的理解是由于datanode之间副本的复制是通过pipiline传送的,flum