问题 Hadoop MapReduce:对减速器数量的澄清


在MapReduce框架中,映射器生成的每个密钥都使用一个reducer。

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

这是什么意思?减速器数量的参数值是否指定减少器的数量而不是实际减速器的数量?


5989
2018-03-12 18:38


起源



答案:


一个reducer用于映射器生成的每个键

这个评论不正确。对由分组比较器分组的每个密钥进行一次reduce()方法调用。 reducer(task)是一个处理零次或多次reduce()调用的进程。您参考的属性是关于减速器的数量 任务


12
2018-03-12 19:13



这个答案很有帮助 - Tommy


答案:


一个reducer用于映射器生成的每个键

这个评论不正确。对由分组比较器分组的每个密钥进行一次reduce()方法调用。 reducer(task)是一个处理零次或多次reduce()调用的进程。您参考的属性是关于减速器的数量 任务


12
2018-03-12 19:13



这个答案很有帮助 - Tommy


简化@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资源。


4
2018-03-12 21:32



如果我的映射器仅输出1个键怎么办?减速器的数量是否无关紧要,因为在减速器之间分配工作的钥匙太少了? - Bryan
这就是数据偏差,它可能是一个问题,具体取决于您的数据大小。解决或减轻数据倾斜的最常用方法是创建自定义分区程序。这允许数据以不同的方式分配给Reducer。关于分区数据的Yahoo Hadoop Tutorial网站上有一个不错的描述: developer.yahoo.com/hadoop/tutorial/module5.html#partitioning - JamCon