17

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

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

注意:以下是运行 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>
...
4

1 回答 1

17

默认值 1 可能用于 vanilla Hadoop 安装。Hive 覆盖它。

在开源配置单元中(可能还有 EMR)

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

这篇文章说默认 hive.exec.reducers.bytes.per.reducer 是 1G。

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

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

在某些情况下 - 比如说 'select count(1) from T' - Hive 会将 reducer 的数量设置为 1 ,而不管输入数据的大小。这些被称为“完整聚合”——如果查询所做的唯一事情是完整聚合——那么编译器知道来自映射器的数据将减少到微不足道的数量,并且运行多个减速器没有意义。

于 2013-04-25T08:14:30.783 回答