[Fatal Error] total number of created files now is 100385, which exceeds 100000. Killing the job.
出现场景
一般出现在分区表的数据插入阶段,最多产生 [任务数(map/reduce) * 分区数] 个文件(实际会小于这个数值)
解决办法:
使用DISTRIBUTE BY 语句将数据聚集成按分区分布(若分区数据量分布差异不是很大,优先推荐该办法)
或者减少reduce数以减少产生文件数(调整hive.exec.reducers.bytes.per.reducer,若调整后出现倾斜,sql添加 DISTRIBUTE BY rand() )(Q2:或者调整参数 set hive.groupby.skewindata=true? 解答:该参数不适用与distribute by 场景)
Q3:DISTRIBUTE BY会产生对应的分区数量的reduce吗? 解答:没有必然关系,reduce是和参数或者map输出文件大小有关系的,和分区没有关系
与map输入小文件合并 和 mr输出小文件合并 的区别?
map输入小文件合并 | 配置Map输入合并 -- 每个Map最大输入大小,决定合并后的文件数 set mapred.max.split.size=256000000; -- 一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并 set mapred.min.split.size.per.node=100000000; -- 一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并 set mapred.min.split.size.per.rack=100000000; -- 执行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; |
mr输出小文件合并 | hive.merge.mapfiles 在map-only job后合并文件,默认true hive.merge.mapredfiles 在map-reduce job后合并文件,默认false(Q1:能否解决上述场景问题 解答,可以,但是会增加map_only job) hive.merge.size.per.task 合并后每个文件的大小,默认256000000 hive.merge.smallfiles.avgsize 平均文件大小,是决定是否执行合并操作的阈值,默认16000000 |
参考文章: 【Hive:解决Hive创建文件数过多的问题】(https://www.iteblog.com/archives/1533.html)
参考文章2: http://blog.csdn.net/yycdaizi/article/details/43341239