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

g6baxovj  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(367)

我对mapreduce完全陌生,只是无法理解是否需要根据每个分区中的键对mapper输出进行排序。最终我们想要的是,一个减速机被送入一个由若干对减速机组成的分区 <key,List of Values> 并且每对中的密钥不仅对于相应的分区是唯一的,而且对于所有被馈送到不同归约器的分区也是唯一的。
为了做到这一点,我们需要做什么 sort 在任何阶段。我们不能用一个 hash table 对同一个键对应的值进行分组?
对每个阶段进行分解。在mapper阶段,对于每个输出对,我们简单地散列密钥以找到分区号,然后将相应的对附加到属于同一分区的所有这些对的链表中。因此,最终,由单个Map器获得的输出将是 hashtable . 其中每个分区号都有一个 <key,value> 对没有基于键的顺序,即没有类似键值的位置。
然后将来自不同Map器任务的分区洗牌到一个reducer中。我们现在需要确保首先将所有与同一个键对应的值分组(一种合并),然后将这些合并的值对馈送给 <key,List of Values> 一个单独的减速机功能。在这里我们可以再次使用 hashtable 为此,我们只需遍历所有分区,并为每个键将它们Map到哈希表中的索引,并将相应的值附加到哈希表中的链表中。与我们对每个Map器的输出进行排序的方法相比,这种方法不会节省更多的时间吗?
我已经浏览了这个链接(我现在不能评论这个帖子,所以我写了一个单独的问题)
排序为reducer节省了时间,有助于它轻松区分何时应该启动新的reduce任务。简单地说,当排序后的输入数据中的下一个键与上一个键不同时,它只启动一个新的reduce任务。每个reduce任务接受一个键值对列表,但它必须调用reduce()方法,该方法接受一个键值列表(value)输入,因此它必须按键对值进行分组。如果在Map阶段对输入数据进行预排序(本地),并在reduce阶段简单地合并排序(因为reducer从许多Map器获取数据),那么这样做很容易
不过,我们也可以用哈希表来做同样的事情,是吗?

6qfn3psc

6qfn3psc1#

嗯,是的,你可以用一个哈希表,只要所有东西都在内存中。但是一旦你处理的数据量超过了你电脑的存储容量,你就有问题了。
解决方案是将数据输出到磁盘文件并进行外部排序。

相关问题