我对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从许多映射器获取数据),这很容易实现。
但是我们可以通过使用哈希表来做同样的事情,或者我们不能吗?
答案 0 :(得分:2)
嗯,是的,只要一切都适合内存,你就可以使用哈希表。但是,一旦您使用的数据量超过计算机的内存容量,就会出现问题。
解决方案是将数据输出到磁盘文件并进行外部排序。