考虑mapreduce程序的字数问题。
让我们考虑Map器输出如下:hello 1 world 1 hello 1 hadoop 1 hello 1 hadoop 1
它转到partitioner(我们将2指定为no of reducer,)现在mapoutput get partition在2个部分中第1部分:
你好1
你好1
你好1
第2部分:世界1 Hadoop1 Hadoop1
因为在reducer:我们得到的输入是hello[1,1,1]
世界[1]
hadoop[1,1]
请澄清我对这种价值合并的理解。对于mapreduce:k1,v1->(mapper o/p)k2,v2->(sort and shuffle)k3,[v3]->(reducer o/p)k4,v4
我的查询是在执行combiner之前或执行combiner之后(在排序和洗牌期间)发生值合并的时间。或者,值的合并发生在向reducer级别的reducer提供输入之前。
因为根据我的理解:Map器输出首先进入内存,当它超过mapreduce.task.io.sort.mb的阈值时,它会溢出到本地磁盘,但是在溢出之前,数据是按分区排序的,在每个分区内,它是按键排序的,在调用sort combiner以减小大小之后。Map程序完成后,根据min.num.spips.for.combine值合并溢出文件并调用合并器。
因为,在字数计算问题中,reducer对每个特定键的iterable的所有值进行累加,并写入输出键和值的和。
因为combiner是mini reducer,我们为combiner job.setcombinerclass(reduce.class)指定了相同的reducer类;
那么在排序和洗牌过程中,合并前对合并器的调用是有价值的,否则我的理解是不正确的。请澄清一下
1条答案
按热度按时间gtlvzcf81#
Map器开始将输出存储在缓冲区中,当缓冲区已满时,在数据溢出到磁盘之前,执行合并器以减少数据量。
组合器可以执行0次(如果Map器输出数据量小于缓冲区大小)或1-n次,具体取决于数据量。
您的进程不应该依赖于合并器,合并器只是一个可选的优化,用于减少网络从Map器传输到还原器的数据量。
前一个合并器调用的结果可以与最后一个数据再次合并。您需要保证合路器的输入和输出是兼容的。合路器的输出应与减速机的输入相适应。
合并器就像一个本地还原器,在数据被洗牌并传输到还原器之前,它只为一个Map器合并数据。