Flume 1.7.0 HDFS Sink切换日期目录后遗留.tmp文件问题咨询
解决Flume 1.7.0 HDFS Sink日期切换时遗留.tmp文件的问题
我之前也碰到过一模一样的情况,3个Agent每天切换目录后都留个.tmp文件,折腾了好一阵才搞定。核心问题在于Flume默认的文件滚动触发逻辑,和日期目录切换的动作是脱节的——它只会在文件达到指定大小、事件数或者固定时间间隔时,才会把.tmp文件转成正式文件,而单纯的目录切换并不会主动触发未完成文件的收尾。
问题根源拆解
你设置了按240MB滚动文件,但每日目录切换时,那些没达到240MB的小文件还处于.tmp状态,Flume不会因为要切新目录就主动关闭它们,所以这些临时文件就留在了旧日期目录里。
解决方案:配置时间对齐+强制滚动
通过调整HDFS Sink的参数,让文件滚动和日期切换绑定起来,确保每天零点自动收尾旧目录的临时文件,同时切换到新目录。以下是经过验证的完整配置示例:
# HDFS Sink基础配置 a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://namenode:8020/flume/data/%Y%m%d a1.sinks.k1.hdfs.filePrefix = business_log a1.sinks.k1.hdfs.fileSuffix = .log # 按大小滚动:240MB(换算为字节:240*1024*1024=251658240) a1.sinks.k1.hdfs.rollSize = 251658240 # 禁用按事件数滚动(如果不需要的话) a1.sinks.k1.hdfs.rollCount = 0 # 设置按天滚动的时间间隔(86400秒=1天) a1.sinks.k1.hdfs.rollInterval = 86400 # 关键配置:让时间对齐到每天零点,触发滚动+目录切换 a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 1 a1.sinks.k1.hdfs.roundUnit = day # 额外保障:如果文件1小时没有新数据写入,自动滚动(避免全天数据量不足240MB的情况) a1.sinks.k1.hdfs.idleTimeout = 3600 # 其他基础参数 a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.hdfs.writeFormat = Text a1.sinks.k1.hdfs.batchSize = 1000 a1.sinks.k1.hdfs.callTimeout = 30000
关键参数解释
hdfs.round+hdfs.roundValue+hdfs.roundUnit:这三个参数组合会把Flume的时间戳对齐到每天0点,当时间到达零点时,强制关闭当前的.tmp文件,自动切换到新的日期目录。hdfs.rollInterval = 86400:配合时间对齐参数,明确每天触发一次文件滚动,确保零点的收尾动作生效。hdfs.idleTimeout = 3600:如果某个Agent在当天最后几小时没有数据写入,这个参数会让空闲超过1小时的.tmp文件自动完成滚动,彻底避免遗留。
注意事项
- 不要把
hdfs.rollInterval设为0,否则会禁用时间触发的滚动,哪怕配置了round参数也不会生效。 - 确认Flume Agent对HDFS的新日期目录有写入权限,避免因为权限问题导致文件无法重命名。
这样配置后,每天零点每个Agent都会自动把旧目录下的.tmp文件转成正式文件,然后无缝切换到新日期目录写入数据,再也不会遗留临时文件了。
内容的提问来源于stack exchange,提问作者sunnwmy
相关产品推荐
相关产品推荐

