MapReduce处理过程笔记

一、Map端处理

MapReduce处理过程笔记_第1张图片

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端处理

MapReduce处理过程笔记_第2张图片

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。




你可能感兴趣的:(mapreduce,算法,存储,任务,作业,磁盘)