0

考虑 MapReduce 程序的 WordCount 问题。

让我们考虑 Mapper 输出如下: Hello 1 World 1 Hello 1 Hadoop 1 Hello 1 Hadoop 1

它进入分区器(我们将 2 指定为没有减速器,)现在 mapoutput 将分区分为 2 部分 part1:
Hello 1
Hello 1
Hello 1

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

由于在 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

我的查询是在执行合并器之前或执行合并器之后(在排序和洗牌期间)发生这种值合并的时间。或值的合并发生在减速器级别向减速器提供输入之前。

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

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

由于Combiner是mini reducer,我们为combiner指定同一个reducer类 Job.setCombinerClass(Reduce.class);
然后在排序和洗牌期间在合并之前调用组合器是有价值的,否则我的理解不正确。请澄清我

4

1 回答 1

1

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

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

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

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

combiner 就像一个本地化简器,它只为一个 Mapper 组合数据,然后再将数据打乱并传输到化简器。

于 2016-06-08T18:13:11.490 回答