在map-reduce作业的map-phase或reduce-phase中,组合器在哪里组合Map器输出?

gmol1639  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(287)

在我的印象中,合并器就像是作用于本地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阶段运行。

rqenqsqc

rqenqsqc1#

a的主要功能 combiner 是优化。在大多数情况下,它就像一个小型减速机。来自同一本书的第206页,章节-mapreduce如何工作(Map方面):
运行combiner函数可以获得更紧凑的map输出,因此要写入本地磁盘和传输到reducer的数据更少。
引用你的问题,
如果指定了组合器,则在合并期间将运行该组合器以减少写入磁盘的数据量。
两个引号都表示 combiner 主要是为了紧凑。减少输出传输的网络带宽是这种优化的一个优点。
同样,从同一本书中,
回想一下,组合器可以在输入上重复运行,而不影响最终结果。如果只有一个或两个溢出,那么Map输出大小的潜在减少不值得调用合并器的开销,因此不会再次为此Map输出运行。
这意味着hadoop不能保证一个组合器运行多少次(也可以是零)
组合器从不为仅Map作业运行。这是有意义的,因为合并器会更改Map输出。另外,由于它不能保证调用它的次数,因此也不能保证map输出是相同的。

fjnneemd

fjnneemd2#

如果合并器是仅Map作业,则它不会运行。
只有当磁盘上写入的溢出文件超过3个时,组合器才会运行。

相关问题