相比map个数的控制复杂性,reduce个数的设定要相对简单多了,reduce的个数一般最后决定了输出文件的个数,二者相等,如果想多输出文件的个数(这样文件变小,但有可能程序变慢),那么可以人为增加reduce个数。如果想减少文件个数,也可以手动较少reduce个数(同样可能程序变慢)。但实际开发中,reduce的个数一般通过程序自动推定,而不人为干涉,因为人为控制的话,如果使用不当很容易造成结果不准确,且降低执行效率。
参数控制个数:
set mapred.reduce.tasks ; -- 默认值为-1 1.set hive.exec.reducers.bytes.per.reducer=300000000 --我们公司默认值 300Mb 2.set hive.exec.reducers.max=1009 --我们公司默认值,这个值一般不会修改。 3.reduce计算方式:计算reducer数的公式很简单: Num=min(hive.exec.reducers.max,map输出数据量/hive.exec.reducers.bytes.per.reducer)
案例:不同参数控制不同的reduce
--配置一 set mapred.max.split.size=256000000; set mapred.min.split.size=10000000; set hive.exec.reducers.bytes.per.reducer=1000000000; Hadoop job information for Stage-1: number of mappers: 112; number of reducers: 26 Time taken: 237.104 seconds --配置二 set mapred.max.split.size=256000000; set mapred.min.split.size=10000000; set hive.exec.reducers.bytes.per.reducer = 1000000000; Hadoop job information for Stage-1: number of mappers: 112; number of reducers: 26 Time taken: 237.104 seconds
只有一个Reduce的情况:
1.代码用了order by ,因为order by是全局排序;
2.表关联时出现了笛卡尔乘积;
3.使用count distinct,不过最好优化成子查询。
select count(*) from (select id from tablename group by id) 替换 select count(distinct id) from tablename



