learn from 从0开始学大数据(极客时间)
MapReduce 编程模型
包含 Map 和 Reduce 两个过程
- map 的主要输入是一对
<Key, Value>
值,输出一对<Key, Value>
值 - 将相同 Key 合并,形成
<Key, Value 集合 >
- 再将这个
<Key, Value 集合 >
输入 reduce,输出零个或多个<Key, Value>
对
// 计算单词数量的 MapReduce 版本
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
// map 函数
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
// 对每个单词输出一个 < word, 1 > 的键值对
}
}
}
// MR 计算框架会将这些 < word, 1 > 收集起来
// 将相同的 word 放在一起,形成 <word , <1,1,1,1,1,1,1…>> 这样的 <Key, Value 集合 > 数据
// 然后将其输入给 reduce 函数
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
// reduce 函数
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum = val.get();
// 对 word 对应的 1 的集合 求和 sum
}
result.set(sum);
context.write(key, result);
// 输出 < word, sum > 键值对
}
}
}