- MapReduce的编程
- 在集群上的运作
- MapReduce类型与格式
MapReduce的编程
- 设计思路
MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:
map: (k1; v1) → [(k2; v2)]
输入:键值对(k1; v1)表示的数据
处理:文档数据记录(如文本文件中的行,或数据表格中的行)将以“键值对”形式传入map函数;map函数将处理这些键值对,并以另一种键值对形式输出处理的一组键值对中间结果[(k2; v2)]
输出:键值对[(k2; v2)]表示的一组中间数据
reduce: (k2; [v2]) → [(k3; v3)]
输入: 由map输出的一组键值对[(k2; v2)] 将被进行合并处理将同样主键下的不同数值合并到一个列表[v2]中,故reduce的输入为(k2; [v2])
处理:对传入的中间结果列表数据进行某种整理或进一步的处理,并产生最终的某种形式的结果输出[(k3; v3)]
输出:最终输出结果[(k3; v3)]
各个map函数对所划分的数据并行处理,从不同的输入数据产生不同的中间结果输出
各个reduce也各自并行计算,各自负责处理不同的中间结果
数据集合进行reduce处理之前,必须等到所有的map函数做完
在进入reduce前需要有一个同步障(barrier)
这个阶段也负责对map的中间结果数据进行收集整理(aggregation & shuffle)处理,以便reduce更有效地计算最终结果, — 最 终汇总所有reduce的输出结果即可获得最终结果
2、编写Mapper类(以统计sogou500w的Uid为例 – 每位用户搜索的次数)
public class UidMapper extends Mapper<Object, Text, Text, IntWritable> {
public static final IntWritable ONE = new IntWritable(1);
private Text uidText = new Text();
public void map(Object key, Text value, Context context)
throws InterruptedException, IOException {
String line = value.toString();
String[] arr = line.split("\t");
if (null != arr && arr.length == 6) {
String uid = arr[1];
if (null != uid && !"".equals(uid.trim())) {
uidText.set(uid);
context.write(uidText, ONE);
}
}
}
}
3、编写Reducer类
public class UidReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws InterruptedException, IOException {
int sum