【问题标题】:where does combiners combine mapper outputs - in map phase or reduce phase in a Map-reduce job?组合器在哪里组合映射器输出 - 在 Map-reduce 作业的 map 阶段或 reduce 阶段?
【发布时间】:2014-07-18 17:46:38
【问题描述】:

我的印象是,combiner 就像是作用于本地 map 任务的 reducer,即聚合单个 Map 任务的结果,以减少输出传输的网络带宽。

通过阅读Hadoop- The definitive guide 3rd edition,我的理解似乎是正确的。

来自第 2 章(第 34 页)

组合函数 许多 MapReduce 作业受到集群上可用带宽的限制,因此尽量减少在 map 和 reduce 任务之间传输的数据是值得的。 Hadoop 允许用户指定在 map 输出上运行的组合器函数——组合器函数的输出形成 reduce 函数的输入。由于组合器功能是一种优化,因此 Hadoop 不保证它会为特定的地图输出记录调用多少次(如果有的话)。换句话说,调用组合函数零次、一次或多次应该从减速器产生相同的输出。

所以我在字数问题上尝试了以下方法:

job.setMapperClass(mapperClass);
job.setCombinerClass(reduceClass);
job.setNumReduceTasks(0);

这里是计数器:

14/07/18 10:40:15 INFO mapred.JobClient: Counters: 10
14/07/18 10:40:15 INFO mapred.JobClient:   File System Counters
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of bytes read=293
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of bytes written=75964
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of read operations=0
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of large read operations=0
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of write operations=0
14/07/18 10:40:15 INFO mapred.JobClient:   Map-Reduce Framework
14/07/18 10:40:15 INFO mapred.JobClient:     Map input records=7
14/07/18 10:40:15 INFO mapred.JobClient:     Map output records=16
14/07/18 10:40:15 INFO mapred.JobClient:     Input split bytes=125
14/07/18 10:40:15 INFO mapred.JobClient:     Spilled Records=0
14/07/18 10:40:15 INFO mapred.JobClient:     Total committed heap usage (bytes)=85000192

这里是part-m-00000:

hello   1
world   1
Hadoop  1
programming 1
mapreduce   1
wordcount   1
lets    1
see 1
if  1
this    1
works   1
12345678    1
hello   1
world   1
mapreduce   1
wordcount   1

显然没有应用组合器。我知道 Hadoop 不保证是否会调用组合器。但是当我打开 reduce 阶段时,组合器会被调用。

为什么会这样?

现在,当我在how MapReduce works 上阅读第 6 章(第 208 页)时。我看到Reduce side中描述的这一段。

如果映射输出足够小,则将其复制到 reduce 任务 JVM 的内存(缓冲区的大小由 mapred.job.shuffle.input.buffer.percent 控制,它指定要使用的堆的比例以此目的);否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由 mapred.job.shuffle.merge.percent 控制)或达到映射输出的阈值数量(mapred.inmem.merge.threshold)时,它被合并并溢出到磁盘。如果指定了组合器,它将在合并期间运行以减少写入磁盘的数据量。

我从这一段的推论是: 1) Combiner ALSO 在 reduce 阶段运行。

【问题讨论】:

    标签: hadoop mapreduce hadoop2


    【解决方案1】:

    combiner 的主要功能是优化。在大多数情况下,它就像一个小型减速器。来自同一本书的第 206 页,章节 - mapreduce 的工作原理(地图方面):

    运行 combiner 函数可以得到更紧凑的 map 输出,因此写入本地磁盘和传输到 reducer 的数据更少。

    引用你的问题,

    如果指定了组合器,它将在合并期间运行以减少写入磁盘的数据量。

    两个引号都表示combiner 主要是为了紧凑而运行。减少输出传输的网络带宽是此优化的一个优势。

    另外,来自同一本书,

    回想一下组合器 可以在输入上重复运行而不影响最终结果。如果只有 一两次溢出,那么地图输出大小的潜在减少是不值得的 调用组合器的开销,因此不会针对此地图输出再次运行。

    意味着 hadoop 不保证组合器运行多少次(也可以为零)

    永远不会为仅地图作业运行组合器。这是有道理的,因为组合器会更改地图输出。此外,由于它不保证调用的次数,因此也不保证映射输出相同。

    【讨论】:

    • 我不确定我的问题是否清楚。我的问题是为什么当我只有 Mapper 时没有运行组合器。我知道 Hadoop 不保证组合器是否会运行。但是使用映射器和减速器,我看到组合器正在运行。我完全同意Combiner 只是一种优化。
    • 哦!对不起,我误解了你的问题。无论如何,没有减速器,组合器永远不会运行。这是有道理的,因为如果为仅地图作业运行组合器,它会更改地图输出。
    【解决方案2】:
    1. 如果是 Map-Only 作业,则不会运行组合器。

    2. 仅当写入磁盘的溢出文件超过 3 个时才会运行组合器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多