Hive如何选择工作的减速器数量?

时间:2013-04-24 22:27:34

标签: hadoop hive

有几个地方说Hadoop作业中默认的减少器数为1.您可以使用mapred.reduce.tasks符号手动设置减速器的数量。

当我运行Hive作业时(在Amazon EMR,AMI 2.3.3上),它有一些大于1的减速器。看看工作设置,有些东西已经设置了mapred.reduce.tasks,我认为是Hive。它如何选择这个数字?

注意:这是运行Hive作业时的一些消息,应该是一个线索:

...
Number of reduce tasks not specified. Estimated from input data size: 500
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapred.reduce.tasks=<number>
...

1 个答案:

答案 0 :(得分:17)

对于vanilla Hadoop安装,默认值为1。 Hive会覆盖它。

在开源蜂巢(可能是EMR)

# reducers = (# bytes of input to mappers)
             / (hive.exec.reducers.bytes.per.reducer)

This post表示默认hive.exec.reducers.bytes.per.reducer为1G。

您可以使用hive.exec.reducers.max限制此启发式生成的缩减器数量。

如果您确切知道所需的减速器数量,则可以设置mapred.reduce.tasks,这将覆盖所有启发式算法。 (默认情况下,此值设置为-1,表示Hive应使用其启发式方法。)

在某些情况下 - 比如说'从T'选择计数(1) - 无论输入数据的大小如何,Hive都会将减速器的数量设置为1。这些被称为“完全聚合” - 如果查询所做的唯一事情就是完全聚合 - 那么编译器就知道来自映射器的数据将减少到微不足道的数量,并且没有必要运行多个reducers。