Hadoop 组合器在何处组合贴图器输出-在贴图减少作业中的贴图阶段或减少阶段?

Hadoop 组合器在何处组合贴图器输出-在贴图减少作业中的贴图阶段或减少阶段?,hadoop,mapreduce,hadoop2,Hadoop,Mapreduce,Hadoop2,我的印象是,组合器就像是作用于本地map任务的还原器,也就是说,它聚合单个map任务的结果,以减少输出传输的网络带宽 通过阅读《Hadoop-权威指南》第三版,我的理解似乎是正确的 摘自第2章(第34页) 组合器函数 许多MapReduce作业受到集群上可用带宽的限制,因此最小化map和reduce任务之间传输的数据是值得的。Hadoop允许用户指定要在映射输出上运行的组合器函数。组合器函数的输出构成reduce函数的输入。由于combiner函数是一个优化函数,Hadoop不能保证它会为特定的

我的印象是,组合器就像是作用于本地map任务的还原器,也就是说,它聚合单个map任务的结果,以减少输出传输的网络带宽

通过阅读《Hadoop-权威指南》第三版,我的理解似乎是正确的

摘自第2章(第34页)

组合器函数 许多MapReduce作业受到集群上可用带宽的限制,因此最小化map和reduce任务之间传输的数据是值得的。Hadoop允许用户指定要在映射输出上运行的组合器函数。组合器函数的输出构成reduce函数的输入。由于combiner函数是一个优化函数,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
这是
第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阶段时,就会调用合并器

为什么会有这种行为

现在,当我阅读关于MapReduce如何工作的第6章(第208页)时。我看到
Reduce部分描述了这一段

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

我从这一段得出的结论是:
1) 合路器也在reduce阶段运行。

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

运行combiner函数可以实现更紧凑的映射输出,因此要写入本地磁盘和传输到reducer的数据更少

引用你的问题

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

两个引号都表示运行组合器主要是为了紧凑。减少输出传输的网络带宽是这种优化的一个优点

还有,在同一本书中

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

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

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

  • 如果组合器是仅映射作业,则它不会运行

  • 仅当写入磁盘的溢出文件超过3个时,合并器才会运行


  • 我不确定我是否把问题说清楚了。我的问题是,当我只有映射器时,为什么合并器不运行。我知道Hadoop不能保证合并器是否运行。但有了映射器和减速器,我看到合并器正在运行。我完全同意组合器只是一个优化。哦!对不起,我误解了你的问题。无论如何,没有减速器,组合器永远不会运行。这是有意义的,因为如果为仅映射作业运行组合器,它会更改映射输出。