组合器和分区器之间的区别

vhmi4jdf  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(387)

我是mapreduce的新手,只是搞不懂分区器和合并器的区别。我知道两者都运行在map和reduce任务之间的中间步骤,并且都减少了reduce任务要处理的数据量。请举例说明区别。

nszi6y05

nszi6y051#

首先,同意@binary nerd的评论
在map阶段,合路器可以看作是一个小型的异径管。在进一步分发Map器结果之前,它们对Map器结果执行局部缩减。一旦合路器功能被执行,它就被传递给减速机进行进一步的工作。
作为 Partitioner 当我们在一个以上的减速机上工作时,请进入画面。因此,分区器决定哪个reducer负责一个特定的键。他们基本上采取 Mapper 结果(如果 Combiner 然后使用 Combiner 结果)并根据密钥将其发送给负责的减速器
使用组合器和分区器场景:

仅使用分区器场景:

示例:
组合器示例
分区器示例:
分区阶段发生在map阶段之后,reduce阶段之前。分区的数量等于减速器的数量。根据分区函数,数据被划分到不同的约简器中。分区器和组合器的区别在于,分区器根据缩减器的数量对数据进行划分,以便单个分区中的所有数据都由单个缩减器执行。但是,合并器的功能类似于reducer,并处理每个分区中的数据。合路器是对减速器的优化。默认的分区函数是散列分区函数,其中对键进行散列。但是,根据键或值的其他函数对数据进行分区可能很有用。-来源

des4xlb0

des4xlb02#

我认为一个小例子可以非常清楚和迅速地解释这一点。
假设你有一个mapreduce单词计数工作,有2个mappers和1个reducer。

不带合路器。 "hello hello there" =>Map器1=>

(hello, 1), (hello,1), (there,1) "howdy howdy again" =>Map器2=> (howdy, 1), (howdy,1), (again,1) 两个输出都到达减速器=> (again, 1), (hello, 2), (howdy, 2), (there, 1) ###以减速器为合路器 "hello hello there" =>带组合器的mapper1=>
(hello, 2), (there,1) "howdy howdy again" =>带组合器的mapper2=> (howdy, 2), (again,1) 两个输出都到达减速器=> (again, 1), (hello, 2), (howdy, 2), (there, 1) ###结论
最终的结果是相同的,但是当使用组合器时,map输出已经减少了。在本例中,您只向减速机发送2个输出对,而不是3个输出对。因此可以获得io/磁盘性能。这在聚合值时很有用。
组合器实际上是一个应用于map()输出的减速机。
如果您看一看第一个apache mapreduce教程,它恰好就是我刚才演示的mapreduce示例,您可以看到它们使用reducer作为组合器:

job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);

相关问题