我的映射任務返回我下面的輸出:從映射器輸出獲得前N項 - MapReduce的
2 c
2 g
3 a
3 b
6 r
我已經寫了減速的代碼和keycomparator產生正確的輸出,但我怎麼拿到前3名了(前N個通過計數)映射器輸出的:
public static class WLReducer2 extends
Reducer<IntWritable, Text, Text, IntWritable> {
@Override
protected void reduce(IntWritable key, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
for (Text x : values) {
context.write(new Text(x), key);
}
};
}
public static class KeyComparator extends WritableComparator {
protected KeyComparator() {
super(IntWritable.class, true);
}
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
// TODO Auto-generated method stub
// Logger.error("--------------------------> writing Keycompare data = ----------->");
IntWritable ip1 = (IntWritable) w1;
IntWritable ip2 = (IntWritable) w2;
int cmp = -1 * ip1.compareTo(ip2);
return cmp;
}
}
這是減速機的輸出:
r 6
b 3
a 3
g 2
c 2
預期的輸出來回m減速機前幾位是:
r 6
b 3
a 3
謝謝,該解決方案確實爲我工作。將減速器的數量設置爲1不會造成性能問題? – DevHelp
我們不會寫很多輸出,因爲我們需要計算前N個元素,所以我們必須將數據帶到單個縮減器來計算它。你可以使用一個組合器(取決於數據集),這將減少一些性能瓶頸。 –