一、Map端处理
1. JobClient调用JobTracker的submitJob方法,提交作业至作业队列。
2. 作业调度器根据调度算法(P175)从作业队列中获取作业。
3. 作业调度器初始化该作业。
3.1 获取JobClient已经计算好的输入分片信息,然后为每个分片创建一个map任务。
3.1.1输入分片大小一般等于块大小。
3.1.2此时通过JobClient获取的输入分片信息包含分片大小、存储位置。
3.2 根据JobConf的mapred.reduce.task配置创建reduce任务
4. 作业调度器运行该作业。
4.1 调用JobClient将计算好的分片信息发送到JobTracker。
4.2 JobTracker使用其存储的位置信息调度map任务在合适的TaskTracker上处理这些分片信息。
4.2.1JobTracker获取输入分片位置信息。
4.2.2JobTracker访问HDFS的NameNode,获取输入分片的位置所对应的DataNode的位置。
4.2.3JobTracker将map任务分配至保有该DataNode的主机上的TaskTracker。
4.3 在TaskTracker上,map任务把输入分片传给InputFormat的getRecordReader方法来获取这个分片的RecordReader。
4.4 map任务用RecordReader来生成键值对,调用map函数执行。
二、Reduce端处理
1. map函数的输出写入环形缓存。
2. 线程根据溢出规则,读取环形缓存中的数据,写入本地磁盘(写溢出文件)。
2.1 溢出文件按将要传递的目标reduce做分区,同时在分区内排序。
2.2 如果有combiner函数,将在排序后执行。
3. map执行完成时,将产生的多个溢出文件合并成一个已分区、已排序的输出文件。
reduce通过HTTP获取各个map的输出文件的分区信息。
reduce端处理:
1. reduce开始阶段复制,去各个已完成的map找到它自己要的map输出文件中的分区数据。
1.1 如果数据量少,则放在内存中,溢出时,写入磁盘。
1.2 如果数据量大,将数据写入磁盘。
2. 根据合并因子(P179),将所有map输出文件中有用分区数据合并。
3. 读取合并后的文件,作为reduce函数输入。
4. reduce函数运行,输出结果写入HDFS。