报错代码
[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

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信