我有以下配置单元查询:
select count(distinct id) as total from mytable;
自动生成:
1408映射器
1还原剂
我需要手动设置减速器的数量,我已经尝试了以下操作:
set mapred.reduce.tasks=50
set hive.exec.reducers.max=50
但这些设置似乎都没有得到尊重。查询需要很长时间才能运行。有没有一种方法可以手动设置缩减器,或者重写查询,这样可以产生更多的缩减器?谢谢
在配置单元中这样写查询:
SELECT COUNT(DISTINCT id) ....
总是导致只使用一个减速器。您应该:
使用该命令可以设置所需的减速器数量:
设置mapredreduce.tasks=50
将查询重写如下:
SELECT COUNT(*)FROM(SELECT DISTINCT id FROM…)t;
这将导致2个地图+减少工作,而不是一个,但性能将大幅提高。
减速器的数量也取决于输入文件的大小
默认情况下,它是1GB(1000000000字节)。您可以通过设置属性hive.exec.reducers.bytes.per.reducer:来更改它
-
通过更改hive-site.xml
<property> <name>hive.exec.reducers.bytes.per.reducer</name> <value>1000000</value> </property>
-
或使用设置的
$ hive -e "set hive.exec.reducers.bytes.per.reducer=1000000"
您可以在conf/mapred-site.xml
配置文件中设置每个节点派生的减速器数量。请参见此处:http://hadoop.apache.org/common/docs/r0.20.0/cluster_setup.html.
特别是,您需要设置以下属性:
mapred.tasktracker.reduce.tasks.maximum
Mapper完全取决于文件的数量,即我们可以称之为输入拆分的文件的大小。拆分只是数据的逻辑拆分。例如:我的文件大小是150MB,我的HDFS默认块是128MB。它将创建两个拆分意味着两个块。将为此作业分配两个映射器。
Imp注意:假设我指定了拆分大小为50MB,那么它将启动3 Mapper,因为它完全取决于拆分的数量。
Imp注意:如果您期望10TB的输入数据,并且块大小为128MB,则最终会得到82000个映射。除非使用Configuration.set(MRJobConfig.NUM_maps,int)(它只为框架提供提示)将其设置得更高。
注意:如果我们没有指定分割大小,它将使用默认的hdfs块大小作为分割大小。
减速器有三个主要阶段:洗牌、排序和减速。
命令:
1] 设置映射任务:-D mapred.Map.tasks=4
2] 设置减少任务:-D映射Reduce.tasks=2