Map Reduce Programming中减速器中的混洗和排序阶段的目的是什么?

时间:2014-03-03 08:10:50

标签: sorting hadoop mapreduce hdfs shuffle

在Map Reduce编程中,reduce阶段作为子部件进行了混洗,排序和缩减。排序是一件昂贵的事情。

Map Reduce编程中减速器中的混洗和排序阶段的目的是什么?

10 个答案:

答案 0 :(得分:146)

首先shuffling是将数据从映射器传输到reducer的过程,所以我认为很明显减少器是必要的,否则它们将无法拥有任何减少器。输入(或来自每个映射器的输入)。即使在地图阶段结束之前,也可以开始改组,以节省一些时间。这就是为什么当地图状态还不是100%时,您可以看到减少状态大于0%(但小于33%)。

Sorting为reducer节省了时间,有助于轻松区分新的reduce任务何时开始。当分类输入数据中的下一个键与前一个键不同时,它只是简单地启动一个新的reduce任务。每个reduce任务都会获取一个键值对列表,但它必须调用reduce()方法,该方法接受键列表(值)输入,因此必须按键对值进行分组。如果输入数据在地图阶段预先排序(本地)并且在简化阶段简单地合并排序(因为reducers从许多映射器获取数据),这很容易实现。

您在其中一个答案中提到的

Partitioning是一个不同的过程。它确定将在哪个reducer中发送(键,值)对,映射阶段的输出。默认的分区程序使用键上的散列将它们分发到reduce任务,但您可以覆盖它并使用您自己的自定义分区程序。

这些步骤的重要信息来源是Yahoo tutorial

以下是一个很好的图形表示(在此图中shuffle称为“copy”):

enter image description here

请注意,如果指定零reducers(setNumReduceTasks(0)),则根本不会执行shufflingsorting。然后,MapReduce作业在地图阶段停止,并且地图阶段不包括任何类型的排序(因此即使地图阶段更快)。

更新:由于您正在寻找更正式的内容,您还可以阅读Tom White的书“Hadoop:The Definitive Guide”。 Here是你问题的有趣部分。
自2007年2月以来,Tom White一直是Apache Hadoop的提交者,并且是Apache Software Foundation的成员,因此我认为它非常可信且官方......

答案 1 :(得分:38)

让我们重新审视Mapreduce计划的关键阶段。

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

合并阶段由合并者完成。 组合器应将键/值对与相同的键组合在一起。每个组合器可以运行零次,一次或多次。

随机播放和排序阶段由框架完成。来自所有映射器的数据按密钥分组,在减速器之间分配并按密钥排序。每个reducer获取与同一个键相关的所有值。程序员可以提供用于排序的自定义比较功能和用于数据拆分的分区

分区程序决定哪个reducer将获得特定的键值对。

reducer 获取按键排序的排序键/ [值列表]对。值列表包含由映射器生成的具有相同键的所有值。每个 reducer为每个输入键/值对发出零个,一个或多个输出键/值对。

看看Maria Jurcovicova的这个javacodegeeks article和Datta的mssqltips文章,以便更好地理解

以下是safaribooksonline文章

中的图片

enter image description here

答案 2 :(得分:21)

我想在上面的答案中添加一些缺失点。这张来自here的图清楚地说明了实际情况。

enter image description here

如果我再说一次

的真正目的
  • 拆分:通过在不同节点(Mappers)之间分配处理负载来改进并行处理,这将节省整体处理时间。

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

  • 排序(随机播放和排序):使运行时可以轻松安排(生成/启动)新的缩减器,同时通过已排序的项目列表当前键与以前的键不同,它可以生成一个新的reducer。

答案 3 :(得分:4)

某些数据处理要求根本不需要排序。 Syncsort已经在Hadoop中进行了可插拔排序。 Here是一个关于排序的好博客。将数据从映射器移动到reducer的过程称为shuffling,请查看this文章以获取更多信息。

答案 4 :(得分:2)

我一直认为这是必要的,因为mapper的输出是reducer的输入,所以它是根据键空间排序的,然后分成每个reducer输入的桶。您希望确保Key的所有相同值最终都在同一个存储区中转到reducer,以便它们一起缩小。没有必要将K1,V2和K1,V4发送到不同的减速器,因为它们需要在一起才能减少。

尝试尽可能简单地解释

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

enter image description here

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

文字和图片主要取自here

答案 7 :(得分:0)

MapReduce只有两件事可以做到:排序和(通过排序实现)可扩展的GroupBy。

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

答案 8 :(得分:0)

This读起来不错。希望能帮助到你。在排序方面你很关注,我认为它是Map的最后一步中的合并操作。当映射操作完成并且需要将结果写入本地磁盘时,将对从缓冲区生成的分割进行多合并。对于合并操作,在高级中对每个分区进行排序很有帮助。

答案 9 :(得分:0)

那么, 在Mapreduce中,有两个重要的短语叫做 Mapper reducer 都非常重要,但是Reducer是强制性的。在某些程序中,reducer是可选的。现在回答你的问题。 改组和排序是Mapreduce中的两个重要操作。第一个Hadoop框架获取结构化/非结构化数据,并将数据分成Key,Value。

现在,Mapper程序将数据分离并排列成要处理的键和值。生成密钥2和值2值。该值应按适当顺序处理和重新排列,以获得所需的解决方案。现在,在本地系统中完成这种随机和排序(Framework照顾它),并在进程框架清理本地系统中的数据后在本地系统中进行处理。 确定

此处我们还使用合并器分区来优化此随机播放和排序过程。经过适当的安排,这些关键值传递给Reducer以获得所需的客户输出。最后,Reducer获得所需的输出。

K1,V1 - > K2,V2(我们将编写程序映射器), - > K2,V'(这里是数据的随机和软化) - > K3,V3生成输出。 K4,V4。

请注意所有这些步骤仅为逻辑操作,不会更改原始数据。

您的问题:Map Reduce Programming中减速器中的混洗和排序阶段的目的是什么?

简答:处理数据以获得所需的输出。改组是聚合数据,减少是得到预期的输出。