我们先看一看map中对reduce个数产生影响的两个参数
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
hive计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1) ,即如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务.。
针对有些hql,由于我们的产生的计算中间数据量很庞大,那么必然到导致我们的reduce数目过大,甚至超过我们现有集群的全部reduce slots,如果计算时间过长, 这必然导致后续提交的reduce任务处于超长的等待阶段,解决办法办法为一下两种
1.更换或者实现更加公平的作业调度器。
2.限制 hive.exec.reducers.max = 集群内slots的*0.75