【hdfs小文件问题的出现场景及解决方案】
产生场景1
hive中对表执行insert into数据,每次插入数据都会在表目录下形成一个小文件
解决方案:
使用insert overwrite table...(会重写数据,先进行删除后插入)
产生场景2
现象:Flume采集数据时在HDFS上产生大量小文件的问题
flume指定HDFS类型的Sink时,采集数据至HDFS指定目录,出现产生大量小文件的现象。测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用
flume可以配置多种采集方式,每种采集方式对应一个agent配置文件,flume即通过运行agent完成采集工作,这里为了方便重现问题,直接监控整个目录。
在HDFS目录上查看采集到的数据,内容如下,零散小文件,运行一段时间会出现30个小文件:
解决方案
第一种情况(hdfs.path中没有指定对应的目录日期对应格式(%y-%m-%d/%H%M%S)导致小文件产生):
去掉round时间系列参数,并将rollSize和rollCount置0,表示不根据临时文件大小和event数量来滚动文件(滚动文件即指将HDFS上生成的以.tmp结尾的临时文件转换为实际存储文件)。当然,也可以调大rollSize参数(如调至100000000,表示100MB滚动文件,单位是bytes)。
再次重启Flume客户端采集即可。可见不再是小文件了,如下:
第2种情况(检测到复制块正在滚动文件,因而产生新的文件):
https://www.aboutyun.com/forum.php?mod=viewthread&tid=21365
配置的是hdfs.rollInterval,60,文件滚动一次,也就每隔60秒,会新产生一个文件
但是当我启动flume的时候,运行十几秒,不断写入数据,发现hdfs端频繁的产生文件,每隔几秒就有新文件产生
而且在flume的日志输出可以频繁看到这句:
[WARN] Block Under-replication detected. Rotating file.
只要有这句,就会产生一个新的文件
意思就是检测到复制块正在滚动文件
首先说下,日志上传到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,程序就永远不会因为文件所在块的复制而滚动文件了,只会根据你的配置项来滚动文件,可以解决问题。
分析
查阅flume配置参数
rollSize
默认值:1024,当临时文件达到该大小(单位:bytes)时,滚动成目标文件。如果设置成0,则表示不根据临时文件大小来滚动文件。
rollCount
默认值:10,当events数据达到该数量时候,将临时文件滚动成目标文件,如果设置成0,则表示不根据events数据来滚动文件。
round
默认值:false,是否启用时间上的”舍弃”,类似于”四舍五入”,如果启用,则会影响除了%t的其他所有时间表达式;
roundValue
默认值:1,时间上进行“舍弃”的值;
roundUnit
默认值:seconds,时间上进行”舍弃”的单位,包含:second,minute,hour
当设置了round、roundValue、roundUnit参数时,需要在sink指定的HDFS路径上指定按照时间生成的目录的格式,例如有需求,每采集1小时就在HDFS目录上生成一个目录,里面存放这1小时内采集到的数据。
本次产生大量小文件的原因就是hdfs.path中没有指定对应的目录日期对应格式(%y-%m-%d/%H%M%S)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本