在MapReduce框架中,映射器生成的每个密钥都使用一个reducer。
所以你会认为在Hadoop MapReduce中指定Reducers的数量是没有意义的,因为它依赖于程序。但是,Hadoop允许您指定要使用的reducer数量(-D mapred.reduce.tasks = #recer)。
这是什么意思?减速器数量的参数值是否指定减少器的数量而不是实际减速器的数量?
答案 0 :(得分:12)
映射器生成的每个密钥使用一个reducer
此评论不正确。对由分组比较器分组的每个密钥进行一次reduce()方法调用。 reducer(task)是一个处理零次或多次reduce()调用的进程。您引用的属性是关于reducer 任务的数量。
答案 1 :(得分:4)
简化@Judge Mental(非常准确)的答案:reducer任务一次可以处理多个键,但是mapred.reduce.tasks =#参数声明了多少个同时的reducer任务将会为特定的工作而奔波。
例如,如果你的mapred.reduce.tasks = 10:
您有2,000个密钥,每个密钥有50个值(对于均匀分布的10,000 k:v对)。
每个减速器应大致处理200个键(1,000 k:v对)。
例如,如果你的mapred.reduce.tasks = 20:
您有2,000个密钥,每个密钥有50个值(对于均匀分布的10,000 k:v对)。
每个减速器应大致处理100个键(500 k:v对)。
在上面的示例中,每个reducer必须使用的密钥越少,整个作业的速度就越快......当然,只要集群中有可用的reducer资源,就可以了。