运行Job.waitForCompletion()
,先使用JobSubmitter
提交Job,在提交之前,会在Job的作业目录中生成以下文件:
job.split
:当前Job的切片信息,有几个切片对象
job.splitmetainfo
:切片对象的属性信息
job.xml
:job所有的属性配置
本地模式
LocalJobRunner
进行提交,如果是HDFS,使用了yarn,则是YARNJobRunner
创建一个LocalJobRunner.Job()
job启动:Job.start()
Map阶段
MapTask
对象Mapper
Mapper.run()
key-value
MapTaskRunable------>MapTask--------->Mapper--------->Mapper.run()------->Mapper.map()
阶段定义
如果有ReduceTask,MapTask运行期间,分为 map(67%)---sort(33%) 两部分
如果没有ReduceTask,MapTask运行期间,只有map(100%)
map: 使用RecordReader
将切片中的数据读入到Mapper.map(),直至写出:context.write(key,value)
Reduce阶段
ReduceTask
对象Reducer
part-r-000x
文件,保存ReduceTask输出的所有的key-value
,即最后结果ReduceTaskRunable------->ReduceTask------>Reducer----->Reducer.run()------>Reducer.reduce()
阶段定义
shuffle
线程拷贝MapTask指定分区的数据YARN上运行 在提交Job后,创建MRAppMaster进程!
由MRAppMaster,和RM申请,申请启动多个MapTask,多个ReduceTask
Container------>MapTask--------->Mapper--------->Mapper.run()------->Mapper.map() Container------->ReduceTask------>Reducer----->Reducer.run()------>Reducer.reduce()