hadoop的mapreduce实现中 对于key的全排序和对于value的排序

时间:2022-01-27 14:56:01

先说对于key的全排序。

其实如果只有一个partition,则最终的结果肯定是全排序的,因为一个partition对应一个reduce的task,然而reduce的输入本来就是对key有序的。当然只有一个partition不能体现出分布式的威力。如果是分多个partition呢,则只要确保partition是有序的就行了。比如:partition1中的最小值比partition2的最大值要大。但是这里又有另外一个问题,就是你在定义每个partition的边界的时候,可能会导致每个partition上分配到的记录数相差很大,这样数据最多的partition就会拖慢整个系统。这时候我们期望的就是每个partition上分配的数据量基本相同,hadoop提供了一个采样器帮我们预估整个边界,以使数据的分配尽量平均。具体见《hadoop 权威指南》p237

 

再说对于value的排序问题。

hadoop本身并不提供对于value排序的支持,但是可以通过他提供的secondary sort来达成这一目标。怎么做的呢?说白了这里对于value的排序其实还是对于key的排序,只不过这个时候排序使用的key实际上是key+value的组合,但是这个时候问题是“value没有了”,因为value被放到key里面了。那么这个时候reduce如何才能按照原本的key value输入来处理呢,hadoop在reduce之前引入了group 的概念,这个group功能其实就是把key+value的输入按照key做了分组,然后对于每个分组还是按照key value的输入来处理。注意了,这个时候对于同一个key的分组内,value已经是排序的了,因为之前是对于key+value这个组合做的排序,而且排序过程中的比较函数是自己定义的。这个方法是在《hadoop 权威指南》p241的secondary sort中有描述。