在我的印象中,合并器就像是作用于本地map任务的减缩器,也就是它聚合单个map任务的结果,以减少输出传输的网络带宽。
从阅读中 Hadoop- The definitive guide 3rd edition
,我的理解似乎是正确的。
摘自第2章(第34页)
合并器功能许多mapreduce任务受到集群上可用带宽的限制,因此最小化map和reduce任务之间传输的数据是值得的。hadoop允许用户指定要在map输出上运行的combiner函数combiner函数的输出形成reduce函数的输入。由于combiner函数是一个优化函数,hadoop不能保证它会为特定的map输出记录调用它多少次。换言之,调用组合器函数0、1或多次应该可以从减速机产生相同的输出。
所以我在字数问题上尝试了以下方法:
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阶段时,会调用合并器。
为什么会有这种行为?
现在当我读到第六章(第208页)关于 how MapReduce works
. 我看到这一段在 Reduce side
.
如果Map输出足够小(缓冲区的大小由mapred.job.shuffle.input.buffer.percent控制,它指定了用于此目的的堆的比例),则将它们复制到reduce任务jvm的内存中;否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由mapred.job.shuffle.merge.percent控制)或达到Map输出的阈值数目(mapred.inmem.merge.threshold)时,它将被合并并溢出到磁盘。如果指定了组合器,则在合并期间将运行该组合器以减少写入磁盘的数据量。
我从这一段得出的结论是:1)合路器也在reduce阶段运行。
2条答案
按热度按时间rqenqsqc1#
a的主要功能
combiner
是优化。在大多数情况下,它就像一个小型减速机。来自同一本书的第206页,章节-mapreduce如何工作(Map方面):运行combiner函数可以获得更紧凑的map输出,因此要写入本地磁盘和传输到reducer的数据更少。
引用你的问题,
如果指定了组合器,则在合并期间将运行该组合器以减少写入磁盘的数据量。
两个引号都表示
combiner
主要是为了紧凑。减少输出传输的网络带宽是这种优化的一个优点。同样,从同一本书中,
回想一下,组合器可以在输入上重复运行,而不影响最终结果。如果只有一个或两个溢出,那么Map输出大小的潜在减少不值得调用合并器的开销,因此不会再次为此Map输出运行。
这意味着hadoop不能保证一个组合器运行多少次(也可以是零)
组合器从不为仅Map作业运行。这是有意义的,因为合并器会更改Map输出。另外,由于它不能保证调用它的次数,因此也不能保证map输出是相同的。
fjnneemd2#
如果合并器是仅Map作业,则它不会运行。
只有当磁盘上写入的溢出文件超过3个时,组合器才会运行。