2016-06-08 58 views
0

考虑MapReduce程序的WordCount问题。在MapReduce中首先发生合并或合并器首先发生

让我们考虑映射输出如下: 你好1 世界1 你好1 Hadoop的1 你好1 Hadoop的1

它道出分区(我们2指定为没有减速,) 现在mapoutput 2份 第一部分获得分区:
你好1
你好1
你好1

第2部分: 世界1 Hadoop的1 Hadoop的1

因为在减速机: 我们得到输入作为 你好[1,1,1]

世界[1]

的Hadoop [1 ,1]

请澄清我的价值合并发生时的理解。 要的MapReduce: K1,V1 - >(映射器O/P)K2,V2 - >(排序和随机播放)K3,[V3] - >(减速机O/P)K4,V4

我的查询是当这种价值合并发生时,在组合器执行之前或组合器执行之后(在分类和洗牌过程中)。或者在Reducer级别输入Reducer之前发生值合并。

由于根据我的理解: 映射器输出首先进入内存,当它跨越mapreduce.task.io.sort.mb的阈值时,它溢出到本地磁盘,但在溢出数据按分区排序之前,以及在每个分区内,它在排序组合器被调用以减小大小之后通过键排序。 Mapper完成后,溢出文件将被合并,组合器将根据min.num.spills.for.combine值进行调用。

因为在字数问题中,减速器会为每个特定键进行所有迭代值的累加,并写出输出键和值的总和。由于Combiner是迷你型减速器,我们为组合器指定了相同的减速器类 Job.setCombinerClass(Reduce.class);
然后在排序和洗牌过程中合并有价值之前,可以调用Combiner,或者我的理解不正确。 请说明我

回答

1

映射器开始将输出存储在缓冲区中,当缓冲区满时,在数据溢出到磁盘之前,组合器会执行​​以尝试减少数据量。

根据数据量,组合器可以执行0次(如果映射器输出数据量小于缓冲器大小)或1-N次。

你的过程不应该依赖于组合器,组合器只是一个可选的优化,以减少网络从映射器传输到reducer的数据量。

前一个组合器调用的结果可以再次与最后一个数据组合。您需要保证组合器的输入和输出兼容。组合器的输出应与减速器的输入兼容。

组合器就像是一个本地减速器,它在数据混洗和传输到减速器之前,只组合一个映射器的数据。