在地图缩减编程中,缩减程序的洗牌和排序阶段的目的是什么?

在 Map Reduce 编程中,Reduce 阶段将洗牌、排序和 Reduce 作为其子部分。

在地图缩减编程中,缩减程序的洗牌和排序阶段的目的是什么?

117368 次浏览

我一直认为这是必要的,因为 mapper 的输出是 reducer 的输入,所以它根据密钥空间进行排序,然后为每个 reducer 输入分割成桶。你需要确保所有相同的键值最终都在同一个桶里进入减速器,这样它们就可以一起减速了。没有必要把 K1,V2和 K1,V4送到不同的减速器,因为它们需要在一起才能减速。

试着尽可能简单地解释

MapReduce 只做两件事情: 排序和(通过排序实现)可伸缩的 GroupBy。

MapReduce 上的大多数应用程序和设计模式都是基于这两个操作构建的,它们由 shuffle 和 sort 提供。

首先,shuffling是将数据从映射器传输到还原器的过程,所以我认为对于还原器来说这是很明显的,因为否则,他们将不能有任何输入(或者来自每个映射器的输入)。洗牌可以开始甚至在地图阶段已经完成,以节省一些时间。这就是为什么当地图状态不是100% 时,你可以看到减少状态大于0% (但小于33%)。

Sorting为减速器节省了时间,帮助它轻松地区分新的减速任务应该何时开始。简单地说,当排序输入数据中的下一个键与前一个键不同时,它就启动一个新的 reduce 任务。每个 reduce 任务都接受一个键-值对列表,但是它必须调用 reduce ()方法,该方法接受键-list (value)输入,因此它必须按键对值进行分组。如果输入数据在 map 阶段被预先排序(本地) ,并且在 reduce 阶段被简单地合并排序(因为 reducers 从许多 mapper 获得数据) ,那么这样做就很容易。

你在一个答案中提到的 Partitioning是一个不同的过程。它确定将发送映射阶段的输出的缩减器(键、值)对。默认的分区工具使用键上的散列将它们分发到 reduce 任务,但是您可以重写它并使用自己的自定义分区工具。

这些步骤的一个重要信息来源是 雅虎教程(存档)。

一个很好的图形表示如下(图中的 shuffle 被称为“ copy”) :

enter image description here

注意,如果指定了零个减少器(setNumReduceTasks (0)) ,则根本不执行 shufflingsorting。然后,MapReduce 作业停留在 map 阶段,map 阶段不包括任何排序(因此甚至 map 阶段也更快)。

更新: 既然你正在寻找更官方的东西,你也可以阅读汤姆 · 怀特的书《 Hadoop: 最终指南》。给你是你问题的有趣部分。
自2007年2月以来,Tom White 一直是 Apache Hadoop 提交者,并且是该 Apache软件基金会的成员,所以我想这是相当可信和正式的... ..。

有些数据处理需求根本不需要排序。Syncsort 使 Hadoop 中的排序成为可插拔的。给你是他们关于排序的一个很好的博客。将数据从映射器移动到简化器的过程称为洗牌,请查阅 这个文章以获得关于该过程的更多信息。

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

这个 是一个很好的解读。希望能有帮助。关于您所关心的排序,我认为它是用于 Map 的最后一步的合并操作。当映射操作完成,并且需要将结果写入本地磁盘时,将对缓冲区生成的拆分操作执行多合并。对于合并操作,对每个分区进行高级排序很有帮助。

好吧, 在 Mapreduce,有两个非常重要的短语叫做 地图绘制者减速器,它们都非常重要,但 Reducer 是强制性的。在一些程序中,减速器是可选的。现在回到你的问题。 洗牌和分拣是 Mapreduce 的两项重要业务。第一个 Hadoop 框架采用结构化/非结构化数据化,并将数据分离为 Key,Value。

现在,Mapper 程序将数据分离并排列成要处理的键和值。生成键2和值2的值。这些值应该按照正确的顺序进行处理和重新排列,以得到所需的解。现在这个洗牌和排序在您的本地系统中完成(由 Framework 负责) ,并且在本地系统中进行处理,然后进程框架清理本地系统中的数据。 好吧

这里我们也使用 混合器分区来优化这个洗牌和排序过程。经过适当的安排,这些关键值传递到减速器,以获得所需的客户端的输出。最终减速机获得理想的输出。

K1,V1-> K2,V2(我们将编写程序 Mapper) ,-> K2,V’(这里洗牌并软化数据)-> K3,V3生成输出。K4 V4.

请注意,所有这些步骤只是逻辑操作,不改变原始数据。

你的问题: 在 Map Reduce 编程中,在 rereduce 阶段中,重组和排序的目的是什么?

简短回答: 处理数据得到预期的输出。洗牌是聚合数据,减少是得到预期的输出。

让我们回顾一下 Mapreduce 程序的关键阶段。

地图阶段是由映射器完成的。地图绘制者在未排序的输入键/值对上运行。每个映射器为每个输入键/值对发出零个、一个或多个输出键/值对。

联合相位是由组合程序完成的。混合器应该将键/值对与相同的键组合在一起。每个合并器可以运行零次、一次或多次。

洗牌和排序阶段是由框架完成的。来自所有映射器的数据按键进行分组,在还原器之间进行分割,并按键进行排序。每个约简器获得与同一键相关联的所有值。程序员可以提供用于排序的自定义比较函数和用于数据分割的 分隔器

分隔器决定哪个约简器将获得一个特定的键值对。

减速器获得按键排序的已排序的键/[值列表]对。值列表包含映射程序生成的具有相同键的所有值。每个 每个输入键/值对都会产生零个、一个或多个输出键/值对

看看 Maria Jurcovicova 的这篇 javacodegeeks 文章和 Datta 的这篇 Mssqltip文章,你会对它们有更好的理解

下面是来自 Safaribooksonline文章的图片

enter image description here

我想在上面的答案中加入一些缺失的要点。这个来自 给你的图表清楚地说明了实际发生的情况。

enter image description here

如果我再说一遍

  • Split: 通过将处理负载分配到不同的节点(Mappers)来改进并行处理,这将节省整个处理时间。

  • 合并: 收缩每个 Mapper 的输出。这样可以节省将数据从一个节点移动到另一个节点的时间。

  • 排序(Shuffle & Sort) : 让运行时更容易安排(生成/启动)新的减少器,当浏览排序项目列表时,只要当前键与前一个键不同,就可以生成一个新的减少器。

由于其大小,分布式数据集通常存储在分区中,每个分区保存一组行。这也提高了诸如映射或过滤器之类的操作的并行性。洗牌是对数据集的任何操作,需要在其分区之间重新分布数据。示例包括按键进行排序和分组。

对大型数据集进行洗牌的一种常见方法是将执行分割为 map 和 reduce 阶段。然后,数据在 map 和 reduce 任务之间进行洗牌。例如,假设我们想对一个有4个分区的数据集进行排序,其中每个分区是由4个块组成的一组。目标是生成另一个具有4个分区的数据集,但这次是按键排序的。

enter image description here

例如,在排序操作中,每个正方形都是一个已排序的子分区,键在不同的范围内。每个 reduce 任务然后合并-对相同阴影的子分区进行排序。 上图显示了这个过程。最初,未排序的数据集按颜色(蓝色、紫色、绿色、橙色)分组。洗牌的目标是重新组合块的阴影(光明到黑暗)。这种重新分组需要一个全对全的通信: 每个映射任务(一个彩色圆圈)为每个阴影产生一个中间输出(一个正方形) ,这些中间输出被重新组合到它们各自的 reduce 任务(一个灰色圆圈)。

文字和图像大部分取自 给你