MapReduce框架排序和分組

Thinkgamer_gyt發表於2015-08-07

前言:

        Mapreduce框架就是map->reduce,其中Map中的<key,value>是偏移量和行值,在其之前會使用job.setInputFormatClass定義的InputFormat將輸入的資料集分割成小資料塊splites,同時InputFormat提供一個RecordReder的實現。本例子中使用的是TextInputFormat,他提供的RecordReder會將文字的一行的行號作為key,這一行的文字作為value。這就是自定義Map的輸入是<LongWritable, Text>的原因。

       之後呼叫Map類進行split,將其寫入環形記憶體中,待其達到閥值時,對其的80%進行排序排序和分組,這都是在Map和Reduce之間完成,那麼下面我們來看看這些函式類

一、分割槽

參考上一篇部落格:http://blog.csdn.net/gamer_gyt/article/details/47339755

二、排序

參考部落格:http://blog.csdn.net/gamer_gyt/article/details/48025805

按照Key進行排序,其實在每一個Map函式裡就已經預設呼叫了job.setSortComparatorClass(Comparator.class)類進行了排序,但此時只不過對每一個Map函式接受的value(行值)的排序,這裡所說的是map和reduce之間的排序,實現的是對所有的key進行排序

三、分組

job.setGroupingComparatorClass(GroupComparator.class);

如果使用者想自定義排序方式,首先需要實現兩個Comparator並將其按照上面的格式進行配置。每一個Comparator需要繼承WritableComparator基類。如下所示:

public static class GroupComparator extends WritableComparator {
protected GroupComparator() {
super(IntPair.class, true);
}
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
IntPair ip1 = (IntPair) w1;
IntPair ip2 = (IntPair) w2;
return IntPair.compare(ip1.getFirst(), ip2.getFirst());
}
}


這一點在二次排序中深有體現:可以參考http://blog.csdn.net/gamer_gyt/article/details/47315405

相關文章