在典型的MapReduce设置(如Hadoop)中,1个任务使用了多少个reducer,例如,计算单词?我对Google MapReduce的理解意味着只涉及1个reducer。这是对的吗?
例如,单词count将输入分为N个块,N Map将运行,产生(word,#)列表。 我的问题是,一旦Map阶段完成,是否只有一个reducer实例运行来计算结果?还是会有减速器并行运行?
答案 0 :(得分:13)
简单的答案是减速器的数量不必是1,是的,减速器可以并行运行。如上所述,这是用户定义或派生的。
为了保持上下文,我将在这种情况下引用Hadoop,以便您了解事情是如何工作的。如果您在Hadoop(0.20.2)中使用流API,则必须明确定义要运行的减少器数量,因为默认情况下,只会启动1个reduce任务。您可以通过将减少器的数量传递给-D mapred.reduce.tasks=# of reducers
参数来实现。 Java API将尝试导出您需要的reducers数量,但同样您也可以显式设置它。在这两种情况下,您可以使用mapred-site.xml
在mapred.tasktracker.reduce.tasks.maximum
配置文件中设置每个节点可以运行的Reducer数量上限。
在更概念性的说明中,您可以查看hadoop wiki上的this帖子,其中讨论了选择地图数量和减少任务的数量。
答案 1 :(得分:2)
我的简单wordcount示例只使用一个减速器是有意义的 如果您希望计算结果只有一个数字,则必须使用一个减速器(2个或更多减速器将为您提供2个或更多输出文件)。
如果这个减速器需要很长时间才能完成,你可以考虑链接多个减速器,其中下一阶段的减速器将对先前减速器的结果求和。
答案 2 :(得分:1)
这完全取决于具体情况。在某些情况下,你没有任何减速器......一切都可以在mapside完成。在其他情况下,您无法避免使用一个reducer,但通常会出现第二个或第三个map / reduce作业,从而缩小早期结果。但是,一般来说,你想拥有很多减速器,否则就会失去MapReduce的强大功能!例如,在字数统计中,映射器的结果将是成对的。然后根据单词对这些对进行分区,使得每个reducer将接收相同的单词,并且可以为您提供最终的总和。然后每个减速器输出结果。如果你愿意的话,你可以拍摄另一个带有所有这些文件的M / R作业并将它们连接起来 - 这个作业只有一个减速器。
答案 3 :(得分:1)
默认值为1。 如果你正在考虑蜂巢或猪,那么减速器的数量取决于查询,如分组,总和......
如果是你的mapreduce代码,可以通过job / conf上的setNumReduceTasks来定义。
job.setNumReduceTasks(3);
大部分时间是在覆盖getPartition()
时完成,即您使用的是自定义分区程序
class customPartitioner extends Partitioner<Text,Text>{
public int getPartition(Text key, Text value, int numReduceTasks){
if(numReduceTasks==0)
return 0;
if(some logic)
return 0;
if(some logic)
return 1;
else
return 2;
}
}
有一点你会注意到减速器的数量=输出中零件文件的数量。
如果您有疑问,请告诉我。
答案 4 :(得分:0)
减速器并行运行。更改配置文件mapred-site.xml时在作业中设置的reducer数量,或者在运行job命令时设置reducer,或者也可以在程序中设置reducer的数量并行运行。没有必要将其保持为1.默认情况下,其值为1.