我正在阅读MapRedcue的源代码,以更多地了解MapReduce的内部机制。当我试图理解地图阶段产生的数据如何被合并并发送以减少进一步处理的功能时,我遇到了问题。源代码看起来太复杂了,我只是想知道它的概念。
我想知道的是在传递给reduce()函数之前如何对值(作为参数Iterator)进行排序。在MapTask.runOldReducer()中,它将通过传递RawKeyValueIterator来创建ReduceValuesIterator,其中将调用Merger.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
然后在reduce(),
中键将为http://www.abcfood.com/,值将包含对象A,对象B和对象C.
所以它按键http://www.abcfood.com/排序?它是否正确?或者它是什么排序然后传递给reduce函数?
非常感谢。
答案 0 :(得分:1)
假设这是你的输入:
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将得到:(不保证值的顺序)
Key Values
http://www.abcfood.com/ [ "object A", "object C", "object B" ]
http://www.example.com/ [ "object X", "object A" ]
答案 1 :(得分:0)
那么有没有可能在reducer中获得有序值? 我需要处理排序值(计算与密钥一起传递的值之间的差异)。我遇到了问题:) http://cornercases.wordpress.com/2011/08/18/hadoop-object-reuse-pitfall-all-my-reducer-values-are-the-same/
我知道在reducer中复制COPY值是不好的,然后对它们进行排序。我可以让内存溢出。在将KEY + Interable传递给reducer之前,我会更好地对值进行排序。