考虑MapReduce程序的WordCount问题。
让我们考虑一下Mapper输出如下: 你好1 世界1 你好1 Hadoop 1 你好1 Hadoop 1
它去分区器(我们指定为2作为减速器没有,)
现在mapoutput分区分为两部分
第1部分:
你好1
你好1
你好1
2部分: 世界1 Hadoop 1 Hadoop 1
因为在reducer: 我们得到输入 你好[1,1,1]
世界[1]
Hadoop [1,1]
当这种价值合并发生时,请澄清我的理解。 对于MapReduce: K1,V1 - >(Mapper o / p)K2,V2 - > (排序和随机播放)K3,[V3] - > (reducer o / p)K4,v4
我的查询是在合并值之前,在执行Combiner之前或执行Combiner之后(在排序和随机播放期间)。或者在以减速器级别向Reducer提供输入之前发生值的合并。
根据我的理解: 当mapper输出超过mapreduce.task.io.sort.mb的阈值时,它首先进入内存,但它溢出到本地磁盘,但是在溢出数据之前按分区排序,并且在每个分区内它按排序后的键排序组合器被调用以减小尺寸。 Mapper完成后,溢出文件将被合并,并根据min.num.spills.for.combine值调用合并器。
因为在字数统计问题中,reducer会为每个特定键累积所有iterable值,并写出输出键和值的总和。
由于Combiner是迷你减速器,我们为组合器指定相同的减速器类
Job.setCombinerClass(Reduce.class);
然后在排序和洗牌期间合并之前调用Combiner,或者我的理解不合适。
请澄清我
答案 0 :(得分:1)
Mapper开始将输出存储在缓冲区中,当缓冲区已满时,在数据溢出到磁盘之前,组合器会执行以减少数据量。
组合器可以执行0次(如果映射器输出数据量小于缓冲区大小)或1-N次,具体取决于数据量。
您的过程不应取决于组合器,组合器只是一个可选的优化,可以减少网络从映射器传输到Reducer的数据量。
先前组合器调用的结果可以再次与最后数据组合。您需要保证组合器的输入和输出兼容。并且组合器的输出应该与减速器的输入兼容。
组合器就像一个局部缩减器,在数据被混洗并传输到reducer之前,它只组合一个Mapper的数据。