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

Nit*_*nil 106 sorting hadoop shuffle mapreduce hdfs

在Map Reduce编程中,reduce阶段具有随机,排序和减少作为其子部分.排序是一件昂贵的事情.

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

vef*_*hym 160

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

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

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

雅虎教程是这些步骤的重要信息来源.

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

在此输入图像描述

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

更新:既然你正在寻找更正式的东西,你也可以阅读Tom White的书"Hadoop:The Definitive Guide".是你的问题的有趣部分.
自2007年2月以来,Tom White一直是Apache Hadoop的提交者,并且是Apache Software Foundation的成员,所以我想这是非常可靠和正式的......

  • 好吧,我想我已经明白了.我的问题是我忘记了reduce将值列表作为参数而不仅仅是一个键值对.我想你应该在你的答案中详细说明:"每个reduce任务都需要一个键值对列表,但它必须调用reduce方法,它接受一个key-List <value>,所以它必须按键对值进行分组,这很容易如果输入数据在映射器阶段中预先排序" (2认同)

Rav*_*abu 38

让我们重新审视Mapreduce程序的关键阶段.

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

组合相由合成器来完成.该组合应结合键/值对具有相同的密钥.每个组合器可以运行零次,一次或多次.

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

分区决定哪些减速会得到一个特定的键值对.

减速器获得排序完毕关键字/ [值列表]对,由密钥进行排序.值列表包含由映射器生成的具有相同键的所有值.每个reducer为每个输入键/值对发出零个,一个或多个输出键/值对.

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

以下是safaribooksonline文章中的图片

在此输入图像描述


Sup*_*hne 24

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

在此输入图像描述

如果我再说一次真正的目的

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

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

  • 排序(随机和排序):使运行时可以轻松安排(生成/启动)新的减速器,在经过排序项目列表时,只要当前键与前一个不同,它就可以生成新的减速器.

  • 不,我的意思是分区步骤,它决定将数据发送到哪个减速器,默认情况下使用简单的哈希模数,经过更多研究,我相信它出现在组合步骤之后、洗牌和排序之前。 (2认同)
  • @rahulsharma 整个映射减少系统遵循主从协调。所以每个节点间的动作都是基于此。 (2认同)