准备知识:
1.在InputFormat<k,v>这个接口中,有两个方法,InputSplit[] getSplits();
RecordReader<k,v> getRecordReader();
2.mapreduce作业提交与初始化过程。
作业提交:
(1)命令行提交。。。。
(2)获取作业ID,
创建HDFS目录(你指定的存放结果的目录)
上传文件到HDFS(应用程序Jar包,xml文件等)
生成split文件(就是调用你指定的InputFormat中的getSplits)
(3) 向JobTracker提交作业。
作业初始化:
调度器调用JobTracker.initJob()来构造Map Task 和Reduce Task并对他们进行
初始化。
3.Task运行过程分析
Map Task整体流程:
Read: 通过RecodReader(你指定的InputFormat中的getRecordreader()),从输入
的InputSplit中解析出一个个key/value
Map: 将上一步的key/value交给map()处理,形成新的key/value。
Collect:在map()中,调用Partition.getPartition(),形成三元组 <key,value,partition>,写入内存环形缓冲区中。
Spill: (1)当内存缓冲区满了之后,对其中的数据排序(先按照partition,然 后再按照key)
(2)如果有Combiner,对数据做一次聚集
(3)写入临时文件
Combine:将临时文件合并(以分区为单位,并且排序)
Ruduce Task整体流程:
shuffle: 从各个Map Task上拷贝一片数据(按照partition)
merge: 合并文件
sort: 排序,reduce()函数的输入数据时按照key进行聚集的一组数据,
Reduce:
一个Map(这里指的是哪个类)处理的是一个分片,map()函数,处理的是一对
key/value。