11

在 MapReduce 框架中,mapper 生成的每个 key 都使用一个 reducer。

所以你会认为在 Hadoop MapReduce 中指定 Reducer 的数量没有任何意义,因为它取决于程序。但是,Hadoop 允许您指定要使用的 reducer 的数量(-D mapred.reduce.tasks=# of reducers)。

这是什么意思?减速器数量的参数值是否指定了减速器的机器资源数量,而不是实际使用的减速器数量?

4

2 回答 2

12

一个reducer用于mapper生成的每个key

这个评论是不正确的。对分组比较器分组的每个键执行一次 reduce() 方法调用。reducer(任务)是一个处理零个或多个 reduce() 调用的进程。您所指的属性是关于 reducer任务的数量。

于 2014-03-12T19:13:14.683 回答
4

为了简化@Judge Mental 的(非常准确)的回答:一个reducer 任务可以同时处理多个键,但是 mapred.reduce.tasks=# 参数声明了一个特定的作业将同时运行多少个reducer 任务。

例如,如果您的 mapred.reduce.tasks=10:
您有 2,000 个键,每个键有 50 个值(对于均匀分布的 10,000 个 k:v 对)。每个 reducer 应该大致处理 200 个键(1,000 k:v 对)。

例如,如果您的 mapred.reduce.tasks=20:
您有 2,000 个键,每个键有 50 个值(对于均匀分布的 10,000 个 k:v 对)。每个 reducer 应该大致处理 100 个键(500 k:v 对)。

在上面的示例中,每个 reducer 必须使用的键越少,整个工作就会越快……当然,只要集群中有可用的 reducer 资源。

于 2014-03-12T21:32:07.977 回答