在job.submit()时,客户端会去查看输入文件的规模,并根据输入的文件规模决定使用多少个MapperTask来运行Job。同时还会进行任务的规划,划分具体哪个MapTask处理哪个数据文件的具体范围。
等到Job被提交给YARN集群后,ResourceManager会根据当前集群中各节点的情况,选择一台机器启动MR Appmaster,并把Job相关的信息都交给MR Appmaster。然后MR Appmaster就根据任务的分片及数据的分布情况启动对应的MapTask。
然后MapTask就调用InputFormat组件去读取对应的文件,每读取一行就调用Mapper中的map方法。
Mapper输出结果后交给OutputCollector,将数据收集后放入分区且排序的文件中。
等到MapTask全都运行完后再启动ReduceTask。ReduceTask从各个节点的OutputCollector中取属于自己的分区数据。按照key分类,一组调用一次Reducer类中的reduce方法。
然后reduce方法会输出,调用OutputFormat最终写入HDFS中。每一个ReduceTask的输出分到一个Part中。
示意图如下所示: