hive实现设置reduce个数的方法

本文详细介绍了Hive中reduce个数的默认设定及其影响,包括Hive如何自动确定reduce数,以及通过调整参数和直接设置reduce任务数量来优化reduce数的方法。同时,文章强调了reduce数并非越多越好的原则,提供了大数据量下合理设置reduce数的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive实现设置reduce个数的方法

方法/步骤

  1. 1.    Hive自己如何确定reduce数: reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) hive.exec.reducers.max(每个任务最大的reduce数,默认为999)计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;如:select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;             /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04 总大小为9G多,因此这句有10个reduce

  2. 2.    调整reduce个数方法一: 调整hive.exec.reducers.bytes.per.reducer参数的值;set hive.exec.reducers.bytes.per.reducer=500000000; (500M)select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 这次有20个reduce

  3.          3.    调整reduce个数方法二; set mapred.reduce.tasks = 15;select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;这次有15个reduce

  4. 4.    reduce个数并不是越多越好; 同map一样,启动和初始化reduce也会消耗时间和资源;另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

  5. 5.    什么情况下只有一个reduce; 很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:a)    没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 写成 select count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04';这点非常常见,希望大家尽量改写。b)    用了Order byc)    有笛卡尔积通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成;同样的,在设置reduce个数的时候也需要考虑这两个原则:使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值