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

Posted

技术标签:

【中文标题】我们真的需要在 MapReduce 框架中进行排序吗?【英文标题】:Do we really need sorting in the MapReduce framework? 【发布时间】:2017-11-04 19:06:54 【问题描述】:

我对 MapReduce 完全陌生,只是不知道需要根据每个分区中的键对映射器输出进行排序。最终,我们想要的只是为 reducer 提供一个分区,该分区由几对 <key,List of Values> 组成,并且每对中的 key 不仅对于相应的分区而且对于馈送到不同 reducer 的所有分区都是唯一的。

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

为每个阶段分解它。在映射器阶段,对于每个输出对,我们只需对键进行哈希运算以找到分区号,然后将相应的对附加到属于同一分区的所有此类对的链表中。所以最后,单个映射器获得的输出将是hashtable。对于每个分区号,我们有一个<key,value> 对的链接列表,没有任何基于键的顺序,即没有相似键值的位置。

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

我已经通过link (我目前无法评论线程,所以我写了一个单独的问题。)最上面的答案提到了

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

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

【问题讨论】:

【参考方案1】:

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

解决办法是把数据输出到磁盘文件,做外部排序。

【讨论】:

以上是关于我们真的需要在 MapReduce 框架中进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

MapReduce排序

MapReduce二次排序

hadoop MapReduce之辅助排序

Hadoop学习笔记—11.MapReduce中的排序和分组

大数据之Hadoop(MapReduce):Partition之WritableComparable排序

透过生活看实质,源码解析分布式计算框架MapReduce(附源码)