在 MapReduce 中先合并还是合并器先发生

Do Merge happen first or combiner happen first in MapReduce

考虑 MapReduce 程序的 WordCount 问题。

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

它转到分区器(我们指定 2 作为 reducer 的编号,) 现在 mapoutput 将分区分成两部分 第 1 部分:
你好 1
你好 1
你好 1

第二部分: 世界 1 Hadoop 1 Hadoop 1

从减速器开始: 我们得到的输入是 你好 [1,1,1]

世界[1]

Hadoop [1,1]

当这种价值合并发生时,请澄清我的理解。 对于 MapReduce: K1, V1 ->(Mapper o/p) K2, V2 -> (排序和随机播放) K3, [V3] -> (reducer o/p) K4, v4

我的查询是何时发生这种值合并,在执行 Combiner 之前或执行 Combiner 之后(在排序和随机播放期间)。或者值的合并发生在减速器级别的减速器输入之前。

因为据我了解: 当 Mapper 输出超过 mapreduce.task.io.sort.mb 的阈值时,它首先进入内存,它被溢出到本地磁盘,但在溢出之前数据按分区排序,并且在每个分区内它在调用排序组合器后按键排序减小尺寸。 Mapper 完成后,合并溢出文件并根据 min.num.spills.for.combine 值调用组合器。

因为,在字数统计问题中,reducer 对每个特定键的 iterable 的所有值进行累加,并写入输出键和值的总和。

由于Combiner是mini reducer,我们为combiner指定相同的reducer class Job.setCombinerClass(Reduce.class);
然后在排序和洗牌期间合并之前调用 Combiner 是值得的,或者我的理解是不正确的。 请给我解释一下

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

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

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

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

合并器就像一个本地缩减器,在数据被打乱并传输到缩减器之前,只为一个映射器合并数据。