首先运行的是什么:分区器还是合并器?

j8yoct9x  于 2021-06-04  发布在  Hadoop
关注(0)|答案(8)|浏览(243)

我在想分区器和合并器之间,哪个先运行?
我的观点是首先是partitioner,然后是combiner,然后键被重定向到不同的reducer,这看起来像partitioner,所以我很困惑。请帮助我理解。

tpxzln5u

tpxzln5u1#

Map器->组合器->分区->减速机

dphi5xsq

dphi5xsq2#

合路器是一个Map侧减速机。它意味着减速机执行合路器所做的一切。组合器的主要用途是调整/优化性能。在组合器对代码进行优化后,请求器分离并协助获得多个输出。合并器是可选的,但对于大文件非常推荐。
分区器根据减速机的数量对数据进行划分,并根据输出的要求进行划分。例如:输出公的,母的,使用分区器将两个输出分开。
第一个合并器会来,然后分区器会来,两者都只在mapside中来,而不是在reducer中来。

5f0d552i

5f0d552i3#

组合器不更改输出Map任务的键值对。它基于相同的键进行组合,并发出相同的键/列表值对。
partitioner从map/combiner(如果存在)获取输入,然后对数据进行分段,并且在处理过程中可以发出新的k列表值对。
所以Map-->合并->分区-->减少。

368yc8dk

368yc8dk4#

合路器在分路器前面运行
合并器在map之后运行,以减少map输出的项目计数。从而减少了网络过载。减少分区器后的运行次数

mgdq6dx1

mgdq6dx15#

你的问题的直接答案是=>combiner
细节:合路器可以被看作是Map阶段的小型减速机。在进一步分发Map器结果之前,它们对Map器结果执行局部缩减。一旦合路器功能被执行,它就被传递给减速机进行进一步的工作。
作为
分离机进入画面时,我们正在工作一个以上的减速器。因此,分区器决定哪个reducer负责一个特定的键。它们基本上获取Map器结果(如果使用combiner,则返回combiner结果)并根据密钥将其发送给负责的reducer。
为了更好地理解,您可以参考下面的图片,这是我从hadoop上的yahoo开发者教程中获取的。

(图片来源:flickr.com)
这是教程。

krugob8w

krugob8w6#

在hadoop-权威指南第3版第209页中,我们有以下文字:
在将数据写入磁盘之前,线程首先将数据划分为与最终将发送到的缩减器相对应的分区。在每个分区中,后台线程执行内存中的按键排序,如果有组合器函数,则在排序的输出上运行。运行combiner函数可以获得更紧凑的map输出,因此要写入本地磁盘和传输到reducer的数据更少。
每次内存缓冲区达到溢出阈值时,都会创建一个新的溢出文件,因此在map任务写入最后一个输出记录之后,可能会有几个溢出文件。在任务完成之前,溢出文件将合并到单个分区和排序的输出文件中。配置属性io.sort.factor控制一次合并的最大流数;默认值为10。
如果至少有三个溢出文件(由min.num.spips.for.combine属性设置),则在写入输出文件之前,将再次运行合并器。回想一下,合并器可以在输入端重复运行而不影响最终结果。如果只有一个或两个溢出,那么Map输出大小的潜在减少不值得调用合并器的开销,因此不会再次为此Map输出运行合并器。因此,合并溢出文件期间会运行合并器。
所以答案似乎是:
Map->分区器->排序->合并器->溢出->合并器(如果溢出>=3)->合并。
但是,在apache教程中有以下几个词:
Map器输出被排序,然后按还原器进行分区。
内容与权威指南不同。答案似乎是:
Map->排序->组合器->分区器->溢出->组合器(如果溢出>=3)->合并。
哪一个是正确的?我倾向于接受apache教程中的后一个,但不太确定。

oogrdqng

oogrdqng7#

Partitioner 在之前运行 Combiner :mapreduce综合图。
您可以有自定义的分区逻辑,并且在Map器结果被分区之后,分区被排序并保存 Combiner 应用于已排序的分区。
请参阅hadoopmapreduce综合说明。
我通过运行自定义的字数计算程序来检查它 Combiner 以及 Partitioner 使用时间戳记录:

Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682580 : hello : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682582 : hello : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682583 : hello : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682583 : world : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682584 : world : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682585 : hello : 1
Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
INFO: Partitioner: 1524483682585 : world : 1
18/04/23 14:41:22 INFO mapred.LocalJobRunner: 
18/04/23 14:41:22 INFO mapred.MapTask: Starting flush of map output
18/04/23 14:41:22 INFO mapred.MapTask: Spilling map output
18/04/23 14:41:22 INFO mapred.MapTask: bufstart = 0; bufend = 107; bufvoid = 104857600
18/04/23 14:41:22 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214368(104857472); length = 29/6553600
Apr 23, 2018 2:41:22 PM mapreduce.WordCountCombiner reduce
INFO: Combiner: 1524483682614 : hello 
Apr 23, 2018 2:41:22 PM mapreduce.WordCountCombiner reduce
INFO: Combiner: 1524483682615 : world
njthzxwz

njthzxwz8#

分区优先。
根据《hadoop权威指南》,mapper的输出首先写入内存缓冲区,然后在缓冲区即将溢出时溢出到本地目录。溢出的数据根据分区器进行划分,如果给定组合器,则在每个分区中对结果进行排序和组合。
您可以简单地修改wordcount mr程序来验证它。我的结果是:(“敏捷的棕色狐狸跳过了一只懒狗”)
单词、步骤、时间
福克斯,Map绘制者,**********754
福克斯,分区者,**********754
福克斯,组合器,**********850
福克斯,减速器,**********904
显然,合并器在分区器之后运行。

相关问题