Hadoop-MR maptask 工作流程
RM 整体流程
- 读取数据 k1,v1
- 数据映射 k2,v2
- 数据分区
- 分区内排序
- 分区内数据合并
- 数据分组发送(shuffle)
- 数据reduce
- 数据输出保存
maptask部分
1个切片对应1个maptask
一般是1个block对应1个切片
- 读取对应切片的数据 k1,v1
- 进行数据映射 k2,v2
- 映射完的数据写入环形缓冲区,同时计算分区键。
- 环形缓存区写满80%后,会将数据写入到临时文件,同时进行排序、合并。排序规则先按分区号,后按key。
- 数据都处理完后,会将临时文件进行有序合并(以上排序采用了归并排序的设计)
- 将最终数据发送至reducetask
流程图
(抽象流程)
源码示例
- Mapper
- org.apache.hadoop.mapreduce
/**
* Mapper根方法
* 自己写可以继承该方法
*/
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
// map 启动函数
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
while (context.nextKeyValue()) {
// 遍历每一行数据,底层会自动根据 split 和 reader 读取数据
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
}
}
// 数据映射函数
protected void map(KEYIN key, VALUEIN value,
Context context) throws IOException, InterruptedException {
//
context.write((KEYOUT) key, (VALUEOUT) value);
}
}
- MapTask
- org.apache.hadoop.mapred
// maptask 核心类