(一)小文件产生的原因
1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增。
2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的)。
3.数据源本身就包含大量的小文件。
(二)小文件产生的影响
1、首先对底层存储HDFS来说,HDFS本身就不适合存储大量小文件,小文件过多会导致namenode元数据特别大,占用太多内存,严重影响HDFS的性能
2、对 hive 来说,在进行查询时,每个小文件都会当成一个块,启动一个Map任务来完成,而一个Map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的Map数量是受限的。
(三)如何解决
1、从源头控制
尽量不要用textfile,在一定程度上可以减少小文件。
2、用hive的参数控制
(1)set hive.merge.mapfiles = true -- 设置map端输出进行合并
(2)set hive.merge.mapredfiles=