我有以下配置单元查询:
select count(distinct id) as total from mytable;
自动产生:
1408 Mappers
1减速机
我需要手动设置减速器的数量,我尝试了以下几种:
set mapred.reduce.tasks=50
set hive.exec.reducers.max=50
但这些设置似乎都没有兑现。该查询需要永远运行。有没有办法手动设置Reducer或重写查询,以便它可以导致更多的reducers?谢谢!
答案 0 :(得分:41)
在hive中编写查询,如下所示:
SELECT COUNT(DISTINCT id) ....
总是会导致只使用一个减速器。 你应该:
使用此命令设置所需的reducer数量:
设置mapred.reduce.tasks = 50
重写查询如下:
SELECT COUNT(*)FROM(SELECT DISTINCT id FROM ...)t;
这将导致2个map + reduce作业而不是1个,但性能提升将是巨大的。
答案 1 :(得分:10)
减速器数量还取决于输入文件的大小
默认情况下为1GB(1000000000字节)。你可以通过设置属性hive.exec.reducers.bytes.per.reducer来改变它:
通过更改hive-site.xml
<property>
<name>hive.exec.reducers.bytes.per.reducer</name>
<value>1000000</value>
</property>
或使用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