组合器在哪里组合映射器输出 - 在映射阶段还是减少Map-reduce工作中的阶段?

时间:2014-07-18 17:46:39

标签: hadoop mapreduce hadoop2

我的印象是,合并器就像在本地地图任务上执行的缩减器一样,即聚合单个Map任务的结果,以减少输出传输的网络带宽。

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

从第2章(第34页)

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

所以我在wordcount问题上尝试了以下内容:

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)在减少阶段,组合器 ALSO 运行。

2 个答案:

答案 0 :(得分:5)

combiner的主要功能是优化。在大多数情况下,它就像一个迷你减速机。从同一本书的第206页开始,章节 - mapreduce如何工作(地图方面):

  

运行组合器功能可以实现更紧凑的地图输出,因此可以将更少的数据写入本地磁盘并传输到减速器。

你问题的引用,

  

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

这两个引号都表明combiner主要用于紧凑性。减少输出传输的网络带宽是此优化的一个优势。

另外,从同一本书中,

  

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

意味着hadoop并不保证合并器的运行次数(也可能为零)

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

答案 1 :(得分:0)

  1. 如果组合器是仅限地图的作业,则不会运行。

  2. 如果有超过3个溢出文件写入磁盘,则仅运行组合器。