Sorting 我们真的需要在MapReduce框架中进行排序吗?

Sorting 我们真的需要在MapReduce框架中进行排序吗?,sorting,hadoop,mapreduce,Sorting,Hadoop,Mapreduce,我对MapReduce是一个全新的人,只是不能理解需要根据每个分区中的键对映射器输出进行排序。最终,我们想要的是一个reducer被馈送到一个由若干对组成的分区,并且每对中的密钥不仅对于相应的分区是唯一的,而且对于馈送到不同reducer的所有分区也是唯一的 要做到这一点,在任何阶段都需要进行排序。我们不能使用哈希表对同一个键对应的值进行分组吗 对每个阶段进行细分。在映射器阶段,对于每个输出对,我们只需散列密钥以找到分区号,然后将相应的对附加到属于同一分区的所有此类对的链接列表中。因此,在最后,

我对MapReduce是一个全新的人,只是不能理解需要根据每个分区中的键对映射器输出进行排序。最终,我们想要的是一个reducer被馈送到一个由若干对
组成的分区,并且每对中的密钥不仅对于相应的分区是唯一的,而且对于馈送到不同reducer的所有分区也是唯一的

要做到这一点,在任何阶段都需要进行
排序
。我们不能使用
哈希表
对同一个键对应的值进行分组吗

对每个阶段进行细分。在映射器阶段,对于每个输出对,我们只需散列密钥以找到分区号,然后将相应的对附加到属于同一分区的所有此类对的链接列表中。因此,在最后,单个映射器获得的输出将是一个
哈希表
。其中,对于每个分区号,我们有一个
对的链表,没有任何基于键的顺序,也就是说,相似的键值没有位置

然后,来自不同映射器任务的分区被洗牌到一个reducer中。我们现在需要确保首先将与同一个键对应的所有值分组(一种合并),然后将这些合并的
对馈送到一个单独的reducer函数。在这里,我们同样可以使用一个
哈希表来做同样的事情,我们只需迭代所有分区,并为每个键将它们映射到哈希表中的一个索引,并将相应的值附加到哈希表中的链表中。
与我们对每个映射器的输出进行排序的方法相比,这种方法不会节省更多的时间吗

我已经看过了(我目前不能对这个帖子发表评论,所以我写了一个单独的问题。)上面的答案提到了这一点

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


但是我们也可以通过使用哈希表来做同样的事情,或者我们可以不使用吗?

嗯,是的,只要所有内容都在内存中,就可以使用哈希表。但是,一旦您处理的数据量超过了计算机的内存容量,您就有问题了

解决方案是将数据输出到磁盘文件并进行外部排序