在Map Reduce Programming中,减速器中的洗牌和分类阶段的目的是什么?

在Map Reduce编程中,reduce阶段将其作为其子部分进行混洗,sorting和减less。 分拣是一件昂贵的事情。

在Map Reduce Programming中,减速器中的洗牌和分类阶段的目的是什么?

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

Sorting为减速机节省时间,帮助它轻松区分何时开始新的减速任务。 简单地说,当sorting的input数据中的下一个键与前一个键不同时,它只是启动一个新的减less任务。 每个reduce任务都有一个key-value对的列表,但是它必须调用reduce()方法,该方法需要一个key-list(value)input,所以它必须用key对值进行分组。 如果input数据在映射阶段预先进行了sorting(本地),并且简化了reduce阶段(因为reducer从许多映射器中获取数据),这很容易实现。

Partitioning ,你在其中一个答案中提到,是一个不同的过程。 它决定了哪一个reducer将会发送一个map(map,map)的输出(key,value)对。 默认的分区程序使用密钥上的散列将它们分配给reduce任务,但是您可以覆盖它并使用您自己的自定义分区程序。

雅虎教程是这些步骤的一个很好的信息来源。

一个很好的graphics表示如下(在本图中,洗牌被称为“复制”):

在这里输入图像描述

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

更新:因为你正在寻找更正式的东西,你也可以阅读汤姆怀特的书“Hadoop:权威指南”。 这是你的问题有趣的部分。
Tom White自2007年2月起一直是Apache Hadoop的提交者,并且是Apache软件基金会的成员,所以我猜这是非常可信和正式的。

我们来重温Mapreduce程序的关键阶段。

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

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

洗牌和分类阶段由框架完成。 来自所有映射器的数据按键进行分组,在缩减器之间拆分并按键sorting。 每个reducer获取与同一个键相关的所有值。 程序员可以提供用于sorting的自定义比较函数和用于数据分割的分区器。

分区器决定哪个reducer将得到一个特定的键值对。

reducer获得sorting的键/ [值列表]对,按键sorting。 值列表包含映射器生成的具有相同键的所有值。 每个缩减器为每个input键/值对发出零个,一个或多个输出键/值对

看一下这个由Maria Jurcovicova 编写的javacodegeeks文章,以及Datta的文章,以便更好的理解

以下是来自safaribooksonline文章的图片

在这里输入图像描述

一些数据处理要求根本不需要sorting。 Syncsort已经在Hadoop插件中进行了sorting。 这里有一个很好的博客,他们在sorting。 将数据从映射器移动到还原器的过程称为混洗,请查阅本文获取更多相关信息。

我想在上面的答案中增加一些缺点。 从这里取得的这个图表明确地说明了真正发生的事情。

在这里输入图像描述

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

  • 拆分:通过在不同节点(映射器)之间分配处理负载来改进并行处理,这将节省整个处理时间。

  • 合并:收缩每个映射器的输出。 这将节省将数据从一个节点移动到另一个节点的时间。

  • sorting(Shuffle&Sort):使运行时间可以很容易地计划(产卵/启动)新的减速器,在经过sorting的项目列表的同时,只要当前的键不同于前一个,就可以产生一个新的减速器。

混洗是将映射器的中间数据转移到0,1个或更多个减速器的过程。 每个减速机根据减速机的数量(为了平衡负载)接收一个或多个钥匙及其相关的值。 此外,与每个键相关的值在本地sorting。

我一直认为这是必要的,因为映射器的输出是reducer的input,所以它是根据键空间进行sorting,然后拆分为每个reducerinput的桶。 你想确保一个Key的所有相同的值最终在同一个桶中到达reducer,所以它们一起被减less。 将K1,V2和K1,V4发送到不同的减速器是没有意义的,因为它们需要在一起才能减小。

试图尽可能简单地解释它

MapReduce只做两件事情:sorting和(通过sorting)可扩展的GroupBy。

大部分基于MapReduce的应用程序和devise模式都是基于这两个操作构build的,这两个操作是通过洗牌和sorting来提供的。

这是一个很好的阅读。 希望它有帮助。 在sorting方面你是关心的,我想是在Map的最后一步合并操作。 当映射操作完成后,需要将结果写入本地磁盘时,将对缓冲区产生的分割进行多合并操作。 对于合并操作,在高级中sorting每个分区是有帮助的。

那么在Mapreduce中有两个重要的短语叫MapperReducer都太重要了,但是Reducer是强制性的。 在某些程序中,reducer是可选的。 现在来问你的问题。 在Mapreduce中,混洗和sorting是两个重要的操作。 第一个Hadoop框架采用结构化/非结构化数据,并将数据分为Key,Value。

现在,Mapper程序将数据分离并排列成要处理的键和值。 生成密钥2和值2的值。 这个值应该按照适当的顺序处理和重新排列以得到所需的解决scheme。 现在这个在本地系统中进行的洗牌和sorting(Framework care)在本地系统中经过处理框架清理本地系统中的数据后进行处理。 好

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

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

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

你的问题:Map Reduce Programming中的减速器中的洗牌和分类阶段的目的是什么?

简短的回答:处理数据以获得所需的输出。 混洗是汇总数据,减less得到预期的输出。