相比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
版权声明:本文为qq_30003943原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。