2017-06-03 71 views
2

我对MapReduce完全陌生,无法理解需要根据每个分区中的键对映射器输出进行排序。最终,我们需要的是,一个减速器供给一个由多对<key,List of Values>组成的分区,并且每对中的密钥不仅对于相应的分区是唯一的,而且对于被馈送到不同减速器的所有分区是唯一的。我们真的需要在MapReduce框架中进行排序吗?

为了做到这一点,需要在任何阶段做sort。我们不能使用hash table来分组对应于相同密钥的值吗?

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

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

我已经通过了link(我目前还不能在线程上发表评论,所以我写了一个单独的问题。)顶端回答中提到,

排序的减速可以节省时间,帮助它容易区分何时开始新的减少任务。简单地说,当排序的输入数据中的下一个键与前一个键不同时,它只是启动一个新的减少任务。每个reduce任务都会获取一组键值对,但必须调用reduce()方法,该方法采用键列表(值)输入,因此必须按键对值进行分组。这很容易做到,如果输入的数据是在映射阶段预先排序(本地),在减少相简单归并排序(因为减速许多映射器获得数据)

但是同样我们可以做通过使用哈希表相同或我们不能?

回答

0

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

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

相关问题