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

时间:2017-06-03 13:59:52

标签: sorting hadoop mapreduce

我对MapReduce完全不熟悉,并且根本无法根据每个分区中的键对映射器输出进行排序。最终我们想要的是一个reducer被一个分区组成,该分区由几对<key,List of Values>组成,并且每对中的密钥不仅对于相应的分区而且对于被馈送到不同reducer的所有分区都是唯一的。 / p>

为此,在任何阶段都需要做sort。我们不能使用hash table对与同一个密钥对应的值进行分组吗?

为每个阶段分解。在映射器阶段,对于每个输出对,我们简单地对密钥进行散列以找到分区号,然后将相应的对附加到属于同一分区的所有这些对的链表中。所以最后,单个映射器获得的输出将是hashtable。其中对于每个分区号,我们有一个<key,value>对的链表,没有任何基于密钥的顺序,即没有类似键值的位置。

然后将来自不同映射器任务的分区混洗到reducer。我们现在需要确保我们首先将对应于相同键的所有值(一种合并)分组,然后将这些合并的<key,List of Values>对提供给单独的reducer函数。这里我们再次使用hashtable来做同样的事情,我们只是遍历所有分区,并且每个键将它们映射到哈希表中的索引,并将相应的值附加到哈希表中的链表。  与我们对每个映射器的输出进行排序的方法相比,这种方法不会节省更多时间吗?

我已经完成了link(我目前无法评论该帖子,所以我写了一个单独的问题。)最佳答案提到

  

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

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

1 个答案:

答案 0 :(得分:2)

嗯,是的,只要一切都适合内存,你就可以使用哈希表。但是,一旦您使用的数据量超过计算机的内存容量,就会出现问题。

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