我的印象是,合并器就像在本地地图任务上执行的缩减器一样,即聚合单个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 运行。
答案 0 :(得分:5)
combiner
的主要功能是优化。在大多数情况下,它就像一个迷你减速机。从同一本书的第206页开始,章节 - mapreduce如何工作(地图方面):
运行组合器功能可以实现更紧凑的地图输出,因此可以将更少的数据写入本地磁盘并传输到减速器。
你问题的引用,
如果指定了合并器,它将在合并期间运行,以减少写入磁盘的数据量。
这两个引号都表明combiner
主要用于紧凑性。减少输出传输的网络带宽是此优化的一个优势。
另外,从同一本书中,
回想一下合并者 可以在输入上重复运行而不影响最终结果。如果只有 一两次溢出,那么地图输出大小的潜在减少是不值得的 调用组合器的开销,因此不会再次运行此映射输出。
意味着hadoop并不保证合并器的运行次数(也可能为零)
永远不会为仅限地图的作业运行合并器。这是有道理的,因为组合器会更改地图输出。此外,由于它不能保证调用它的次数,因此也不保证映射输出也是相同的。
答案 1 :(得分:0)
如果组合器是仅限地图的作业,则不会运行。
如果有超过3个溢出文件写入磁盘,则仅运行组合器。