在map reduce编程中,reducer中的洗牌和排序阶段的目的是什么?

muk1a3rh  于 2021-06-04  发布在  Hadoop
关注(0)|答案(9)|浏览(467)

在map-reduce编程中,reduce阶段的子部分是洗牌、排序和reduce。分类是一件昂贵的事情。
在map reduce编程中,reducer中的洗牌和排序阶段的目的是什么?

eblbsuwk

eblbsuwk1#

有些数据处理需求根本不需要排序。syncsort使hadoop中的排序可插入。这里是一个很好的博客,从他们的排序。将数据从Map器移动到还原器的过程称为洗牌(shuffling),请参阅本文以了解有关该过程的更多信息。

eiee3dmh

eiee3dmh2#

mapreduce本机只做两件事:sort和(通过sort实现的)可伸缩groupby。
mapreduce上的大多数应用程序和设计模式都是基于这两种操作构建的,这两种操作由shuffle和sort提供。

aydmsdu9

aydmsdu93#

洗牌是将Map器的中间数据传输到0、1或更多还原器的过程。每个减速器接收一个或多个键及其相关值,具体取决于减速器的数量(对于平衡负载)。此外,与每个键相关联的值被本地排序。

lyr7nygr

lyr7nygr4#

在mapreduce中有两个重要的短语mapper和reducer都太重要了,但是reducer是必需的。在某些程序中,减速器是可选的。现在来回答你的问题。洗牌和排序是mapreduce中的两个重要操作。第一个hadoop框架采用结构化/非结构化数据,并将数据分为键、值。
现在mapper程序将数据分离并排列成要处理的键和值。生成键2和值2的值。该值应按适当顺序进行处理和重新排列,以获得所需的解决方案。现在这个洗牌和排序在您的本地系统中完成(框架处理它),并在本地系统中处理一个又一个处理框架清理本地系统中的数据。好 啊
这里我们还使用组合器和分区来优化这个洗牌和排序过程。经过适当的安排,这些键值传递给reducer以获得所需的客户机输出。最终得到期望的输出。
k1,v1->k2,v2(我们将编写程序mapper),->k2,v'(在这里洗牌并软化数据)->k3,v3生成输出。k4,v4。
请注意,所有这些步骤只是逻辑操作,而不是更改原始数据。
你的问题是:在map reduce编程中,reducer中的洗牌和排序阶段的目的是什么?
简而言之:处理数据以获得所需的输出。洗牌是聚合数据,减少是得到预期的输出。

vnzz0bqm

vnzz0bqm5#

我想在上面的答案中加上一些遗漏的地方。这张图清楚地说明了到底发生了什么。

如果我再说一遍
split:通过在不同的节点(mapper)之间分配处理负载来改进并行处理,这将节省总体处理时间。
合并:收缩每个Map器的输出。这样可以节省将数据从一个节点移动到另一个节点的时间。
排序(shuffle&sort):使运行时可以轻松地调度(生成/启动)新的缩减器,在遍历排序项列表时,只要当前键与前一个键不同,就可以生成新的缩减器。

vjrehmav

vjrehmav6#

让我们重温mapreduce程序的关键阶段。
Map阶段由Map器完成。Map程序在未排序的输入键/值对上运行。每个Map器为每个输入键/值对发射零个、一个或多个输出键/值对。
合并阶段由合并器完成。组合器应该将键/值对与同一个键组合起来。每个合路器可以运行零次、一次或多次。
洗牌和排序阶段由框架完成。来自所有Map器的数据按键分组,在还原器中拆分,并按键排序。每个reducer获得与同一个键关联的所有值。程序员可以提供用于排序的自定义比较函数和用于数据拆分的分区器。
分区器决定哪个减速机将获得一个特定的键值对。
reducer获得按键排序的键/[值列表]对。值列表包含Map程序生成的具有相同键的所有值。每个reducer为每个输入键/值对发出零个、一个或多个输出键/值对。
为了更好地理解,请看一下mariajurcovicova的javacodegeeks文章和datta的mssqltips文章
下面是来自safaribooksonline文章的图片

a0x5cqrl

a0x5cqrl7#

首先 shuffling 是将数据从Map器传输到还原器的过程,因此我认为还原器显然是必要的,因为否则,它们将无法获得任何输入(或来自每个Map器的输入)。洗牌甚至可以在Map阶段结束之前开始,以节省一些时间。这就是为什么当Map状态还不是100%时,您可以看到reduce状态大于0%(但小于33%)。 Sorting 为reducer节省时间,帮助它轻松区分何时应该启动新的reduce任务。简单地说,当排序后的输入数据中的下一个键与上一个键不同时,它只启动一个新的reduce任务。每个reduce任务接受一个键值对列表,但它必须调用reduce()方法,该方法接受一个键值列表(value)输入,因此它必须按键对值进行分组。如果在Map阶段对输入数据进行预排序(本地),并在reduce阶段简单地合并排序(因为reducer从许多Map器获取数据),那么这样做很容易。 Partitioning 你在其中一个答案中提到的,是一个不同的过程。它确定将在哪个减速机中发送Map阶段的输出(键、值)对。默认的分区器使用对键的哈希来将它们分发给reduce任务,但是您可以重写它并使用自己的自定义分区器。
这些步骤的一个重要信息来源是这个yahoo教程(已存档)。
下面是一个很好的图形表示(在本图中,shuffle称为“copy”):

请注意 shuffling 以及 sorting 如果指定零减速器(setnumreducetasks(0)),则根本不执行。然后,mapreduce作业在map阶段停止,map阶段不包括任何类型的排序(因此即使map阶段也更快)。
更新:既然您正在寻找更官方的东西,您也可以阅读tom white的书“hadoop:权威指南”。这是你问题的有趣部分。
自2007年2月以来,tom white一直是Apache Hadoop提交者,并且是Apache软件基金会的成员,所以我认为它是相当可信的和官方的…

4uqofj5v

4uqofj5v8#

这是一本好书。希望有帮助。至于你所关心的排序问题,我认为是Map最后一步的合并操作。当Map操作完成,并且需要将结果写入本地磁盘时,将对从缓冲区生成的拆分操作多重合并。对于合并操作,在高级中对每个分区进行排序是很有帮助的。

eqqqjvef

eqqqjvef9#

我一直认为这是必要的,因为Map器的输出是reducer的输入,所以它是基于keyspace排序的,然后为每个reducer输入拆分成bucket。您希望确保一个键的所有相同值都在同一个bucket中结束,并传递给reducer,以便它们一起被缩减。将k1、v2和k1、v4发送到不同的减速器是没有意义的,因为它们需要在一起才能减速。
尽量简单地解释

相关问题