Sorting MapReduce排序迭代器

Sorting MapReduce排序迭代器,sorting,hadoop,mapreduce,Sorting,Hadoop,Mapreduce,我正在阅读MapRedcue的源代码,以进一步了解MapReduce的内部机制。当我试图理解在映射阶段生成的数据是如何合并并发送到reduce函数进行进一步处理时,我遇到了问题。源代码看起来太复杂了,我只想知道它的概念 我想知道的是值(作为参数迭代器)在传递到reduce()函数之前是如何排序的。在MapTask.runOldReducer()中,它将通过传递RawKeyValueIterator来创建ReduceValuesIterator,在这里将调用merge.merge(),并执行许多操

我正在阅读MapRedcue的源代码,以进一步了解MapReduce的内部机制。当我试图理解在映射阶段生成的数据是如何合并并发送到reduce函数进行进一步处理时,我遇到了问题。源代码看起来太复杂了,我只想知道它的概念

我想知道的是值(作为参数迭代器)在传递到reduce()函数之前是如何排序的。在MapTask.runOldReducer()中,它将通过传递RawKeyValueIterator来创建ReduceValuesIterator,在这里将调用merge.merge(),并执行许多操作(例如收集段)。在阅读代码之后,在我看来,它只会尝试按键排序,并且伴随该键的值将被聚合/收集,而不会被删除。例如,map()可能会生成

Key Value http://www.abcfood.com/aLink object A http://www.abcfood.com/bLink object B http://www.abcfood.com/cLink object C 关键值 http://www.abcfood.com/aLink 对象A http://www.abcfood.com/bLink 对象B http://www.abcfood.com/cLink 对象C 然后在reduce()中

键将为,值将包含对象A、对象B和对象C

那么它是按键排序的?这是正确的吗?或者,它是如何排序并传递给reduce函数的


非常感谢。

假设这是您的输入:

Key                              Value
http://www.example.com/asd       object A
http://www.abcfood.com/aLink     object A
http://www.abcfood.com/bLink     object B
http://www.abcfood.com/cLink     object C
http://www.example.com/t1        object X
减速器将得到以下结果:(不保证值的顺序)


假设这是您的输入:

Key                              Value
http://www.example.com/asd       object A
http://www.abcfood.com/aLink     object A
http://www.abcfood.com/bLink     object B
http://www.abcfood.com/cLink     object C
http://www.example.com/t1        object X
减速器将得到以下结果:(不保证值的顺序)


那么有没有可能在reducer中获得有序值呢? 我需要处理排序的值(计算用键传递的值之间的差异)。我遇到了一个问题:)


我知道在reducer中复制值然后排序是不好的。我可以得到内存溢出。在将KEY+Interable传递给reducer之前,最好先对值进行排序。

那么有没有可能在reducer中获得有序值? 我需要处理排序的值(计算用键传递的值之间的差异)。我遇到了一个问题:)


我知道在reducer中复制值然后排序是不好的。我可以得到内存溢出。在将KEY+Interable传递给reducer之前,最好先对值进行排序。

在mapreduce中从不对值进行排序。您完全搞错了。值在mapreduce中从不排序。你完全搞错了。