Map Reduce编程中的reducer的改组和排序阶段的目的是什么?


113

在Map Reduce编程中,reduce阶段具有改组,排序和reduce的子部分。排序是一项昂贵的事务。

Map Reduce编程中的reducer的改组和排序阶段的目的是什么?


3
我一直认为这是必要的,因为映射器的输出是化简器的输入,因此它是根据键空间进行排序的,然后为每个化简器输入拆分为存储区。
BasicHorizo​​n 2014年

Answers:


171

首先shuffling是将数据从映射器传输到简化器的过程,因此我认为对于简化器来说很明显是必要的,因为否则,它们将无法获得任何输入(或每个映射器的输入) 。改组甚至可以在地图阶段完成之前开始,以节省一些时间。因此,当地图状态尚未达到100%时,您会看到缩小状态大于0%(但小于33%)。

Sorting为减速器节省时间,帮助它轻松区分何时应启动新的减速任务。简单地说,当排序后的输入数据中的下一个键与上一个键不同时,它只是启动一个新的reduce任务。每个reduce任务都会获取一个键-值对列表,但是它必须调用reduce()方法,该方法接受一个key-list(value)输入,因此必须按键对值进行分组。如果输入数据在映射阶段进行了预排序(本地),而在归约阶段简单地进行了归并排序(因为归约器从许多映射器获取数据),则这样做很容易。

Partitioning您在其中一个答案中提到的,是一个不同的过程。它确定映射相位的输出(键,值)对将发送到哪个减速器。默认的分区程序在键上使用哈希将其分配给reduce任务,但是您可以覆盖它并使用自己的自定义分区程序。

这些步骤的重要信息来源是此Yahoo教程

下面是一个很好的图形表示形式(在此图中,混洗称为“复制”):

在此处输入图片说明

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

更新:由于您正在寻找更正式的东西,因此您也可以阅读Tom White的书“ Hadoop:权威指南”。是您问题的有趣部分。
Tom White自2007年2月以来一直是Apache Hadoop的提交者,并且是Apache Software Foundation的成员,所以我认为它是相当可信且正式的...


“排序可以为化简器节省时间,帮助它轻松地区分何时应开始新的化简任务。当排序后的输入数据中的下一个键与上一个不同时,它只是启动了一个新的化简任务,简而言之。” 我没有这部分。Mapper使用分区程序将溢出内容本地划分为多个分区,然后将每个分区发送到reduce。排序在这里有何帮助?
MaxNevermind

1
@MaxNevermind如果您有x个reduce任务(分区),则并不意味着您最终将调用reduce()方法x次。每个不同的键都会调用一次。因此,一个reduce任务可以多次调用reduce()方法。
vefthym '16

“对于每个不同的键都将调用它一次”为什么?映射器以任何方式形成分区(每个单独的键都不需要一个分区),然后每个分区都归约到减速器,这是错误的吗?
MaxNevermind

1
@MaxNevermind映射器输出键和值,它不构成分区。分区由用户定义的化简任务数量和Partitioner实现定义。具有相同键的所有Mappers的输出将使用相同的reduce()方法。这无法更改。但是可以更改的是将其他键(如果有)放置在同一分区中,从而由同一任务处理。reduce任务可以多次调用reduce()函数,但每个键只能调用一次。
vefthym '16

2
好吧,我想我明白了。我的问题是我忘记了reduce将一组值作为参数,而不仅仅是一对键值对。我认为您应该在回答中详细说明:“每个reduce任务都需要一个键-值对的列表,但是它必须调用带有key-List <value>的reduce方法,因此必须按键对值进行分组,这很容易如果输入数据在映射器阶段已预先排序,该怎么办”
MaxNevermind

42

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

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

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

洗牌和排序阶段是由框架来完成。来自所有映射器的数据按键分组,在化简器中拆分,然后按键排序。每个化简器获得与同一键关联的所有值。程序员可以提供用于排序的自定义比较功能,以及用于数据拆分的分区程序。

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

减速器取得排序键/ [值列表]对,排序由所述密钥。值列表包含映射器生成的具有相同键的所有值。每个缩减器为每个输入键/值对发出零,一个或多个输出键/值对

看看这个javacodegeeks 文章由玛丽亚Jurcovicova和mssqltips由达塔为了更好的理解文章

以下是Safaribooksonline文章的图片

在此处输入图片说明


我认为图片中有一个错字(我意识到这只是复制到这里)。我相信ieReducers和Output下的字符串实际上应该是is
杰夫·埃文斯

32

我想到的只是添加以上答案中缺少的一些要点。从这里获取的这张图清楚地说明了实际情况。

在此处输入图片说明

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

  • 拆分:通过在不同节点(映射程序)之间分配处理负载来改善并行处理,这将节省总体处理时间。

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

  • 排序(随机排序):使运行时可以轻松地计划(生成/启动)新的reducer,在浏览排序项目列表时,只要当前键与先前的键不同,就可以生成一个新的reducer 。


分区步骤将进入该图中的什么位置?地图之后和结合之前?
Joel

@Joel希望您提到“拆分”步骤?
Supun Wijerathne

不,我的意思是分区步骤,它决定默认情况下使用简单的哈希模将数据发送到哪个reducer,经过更多的研究,我相信它是在合并步骤之后,洗牌和排序之前进行的。
Joel

1
@Joel我不太清楚您打算描述什么。简而言之,确切的步骤顺序可能是针对特定问题的。我可以说在某些情况下甚至不需要排序。回到您的输入,如果我专门谈论上面的简单单词计数示例,我真的没有看到需要任何这样的分区来确定缩减器的需求。在这里,很容易生成每个键的减少。但是我可以猜测您的观点在某些情况下可能是有效的。坦白说,我对此没有确切的想法。
Supun Wijerathne

4

一些数据处理要求根本不需要排序。Syncsort已使Hadoop中的排序可插入。是他们关于排序的一个不错的博客。移动从地图制作到减压器数据的过程被称为洗牌,检查文章针对的相同的信息。


2

我一直认为这是必要的,因为映射器的输出是化简器的输入,因此根据键空间对它进行排序,然后为每个化简器输入拆分为存储桶。您要确保将所有相同的Key值最终存储到归还到reducer的同一存储桶中,以便将它们一起归约。没有必要将K1,V2和K1,V4发送到不同的异径管,因为它们需要在一起才能被还原。

试图尽可能简单地解释它


如果我们想将k1,v1和k1,v4发送到同一个reducer,我们可以改组。那么分类的目的是什么?
Nithin K Anil 2014年

它出于多种原因进行排序,原因之一是,如果未对输入进行排序,则MapReduce作业将所有KV对发送到减速器时,它必须扫描所有Mapper输出以拾取K1,VX的每个实例。 。相反,如果在K2,VX被拾取后立即对Mapper输出进行排序,则您知道所有K1,VX已被拾取,并且该集合可以发送到减速器进行处理,这样做的好处是您不需要必须等待每个减速器准备就绪,以便每个减速器开始减速。
BasicHorizo​​n 2014年

同样在聚合时,如果您指定要聚合所有K1,V1,并且当化简器在K2,V2上拾取后对归约器的输入进行排序,它就会知道不再存在K1,V1的实例,因此它可以完成它的聚合,但是如果未对化

2

改组是将来自映射器的中间数据传输到0.1或多个reducer的过程。每个化简器接收1个或多个键及其关联值,具体取决于化简器的数量(对于平衡负载)。此外,与每个键关联的值在本地进行排序。



0

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


0

好吧,在Mapreduce中有两个重要的短语,称为Mapperreducer都太重要了,但是Reducer是必需的。在某些程序中,减速器是可选的。现在来问你的问题。改组和排序是Mapreduce中的两个重要操作。第一个Hadoop框架采用结构化/非结构化数据并将数据分为键,值。

现在,Mapper程序将数据分离并将数据整理为要处理的键和值。生成键2和值2的值。该值应按正确的顺序进行处理和重新排列以获得所需的解决方案。现在,此处理和排序已在本地系统中完成(框架要小心),并在流程框架清理本地系统中的数据之后在本地系统中进行处理。好

在这里,我们还使用组合器分区来优化此混洗和排序过程。经过适当安排,这些关键值将传递给Reducer以获取所需的客户输出。最后,Reducer获得所需的输出。

K1,V1-> K2,V2(我们将编写程序Mapper),-> K2,V'(在这里对数据进行随机排序和软化)-> K3,V3生成输出。K4,V4。

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

您的问题:Map Reduce编程中的reducer的改组和排序阶段的目的是什么?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.