Hive无法手动设置减速器数量

时间:2012-01-06 17:43:16

标签: hadoop mapreduce hive

我有以下配置单元查询:

select count(distinct id) as total from mytable;

自动产生:
1408 Mappers
1减速机

我需要手动设置减速器的数量,我尝试了以下几种:

set mapred.reduce.tasks=50 
set hive.exec.reducers.max=50

但这些设置似乎都没有兑现。该查询需要永远运行。有没有办法手动设置Reducer或重写查询,以便它可以导致更多的reducers?谢谢!

4 个答案:

答案 0 :(得分:41)

在hive中编写查询,如下所示:

 SELECT COUNT(DISTINCT id) ....

总是会导致只使用一个减速器。 你应该:

  1. 使用此命令设置所需的reducer数量:

    设置mapred.reduce.tasks = 50

  2. 重写查询如下:

  3.   

    SELECT COUNT(*)FROM(SELECT DISTINCT id FROM ...)t;

    这将导致2个map + reduce作业而不是1个,但性能提升将是巨大的。

答案 1 :(得分:10)

减速器数量还取决于输入文件的大小

默认情况下为1GB(1000000000字节)。你可以通过设置属性hive.exec.reducers.bytes.per.reducer来改变它:

  1. 通过更改hive-site.xml

    <property>
       <name>hive.exec.reducers.bytes.per.reducer</name>
       <value>1000000</value>
    </property>
    
  2. 或使用set

    $ hive -e "set hive.exec.reducers.bytes.per.reducer=1000000"

答案 2 :(得分:1)

您可以设置conf/mapred-site.xml配置文件中每个节点生成的Reducer数。见这里:http://hadoop.apache.org/common/docs/r0.20.0/cluster_setup.html

特别需要设置此属性:

mapred.tasktracker.reduce.tasks.maximum

答案 3 :(得分:0)

映射器完全取决于文件的数量,即我们可以将其称为输入拆分的文件大小。斯普利特注意到了数据的逻辑分裂。 例如:我的文件大小为150MB,我的HDFS默认块为128MB。它将创建两个分割意味着两个块。将为此工作分配两个Mapper。

Imp注意:假设我已指定分割大小为50MB然后它将启动3 Mapper,因为它完全取决于分割数量。

Imp注意:如果您预计 10TB 的输入数据且块大小为 128MB ,您最终会得到 82,000个地图,除非Configuration.set(MRJobConfig.NUM_MAPS,int)(仅提供框架提示)用于将其设置得更高。

注意:如果我们没有指定拆分大小,则默认hdfs块大小为拆分大小。

缩减器有3个主要阶段:随机播放,排序和缩小

命令:

1]设置地图任务: -D mapred.map.tasks = 4
2]设置减少任务: -D mapred.reduce.tasks = 2