#### 一、从Map到Reduce

MapReduce事实上是分治算法的一种实现。其处理过程亦和用管道命令来处理十分相似，一些简单的文本字符的处理甚至也能够使用Unix的管道命令来替代，从处理流程的角度来看大概例如以下：

cat input | grep |   sort  |  uniq -c | cat > output# Input -> Map -> Shuffle & Sort -> Reduce -> Output

Sort当然就是对中间的结果进行按key排序。由于Reducer的输入是严格要求按key排序的。

Input->Map->Shuffle&Sort->Reduce->Output 仅仅是从宏观的角度对MapReduce的简单描写叙述，实际在MapReduce的框架中，即从编程的角度来看，其处理流程是 Input->Map->Sort->Combine->Partition->Reduce->Output。用之前的对温度进行统计的样例来讲述这些过程。

##### Reduce Phase

Reducer获取Mapper输出的中间结果。作为输入对某一key范围区间进行处理，使用JobConf.setReducerClass来设置。

##### Output Phase

Reducer的输出格式和Mapper的输入格式是相相应的，当然Reducer的输出还能够作为还有一个Mapper的输入继续进行处理。

#### 二、Details of Job Run

• Client，用于提交MapReduce job。
• JobTracker，负责协调job的执行。
• Distributed filesystem，用于存储上述实体执行时共享的job文件（如中间结果文件）。

##### Job Submission

1. Client向JobTacker申请一个新的job ID（step 2），job ID形如job_200904110811_0002的格式，是由JobTracker执行当前的job的时间和一个由JobTracker维护的自增计数（从1開始）组成的。
2. 检查job的output specification。比方输出文件夹是否已经存在（存在则抛异常）、是否有权限写等等。
3. Computes the input splits for the job。这些input splits就是作为Mapper的输入。
4. Copies the resources needed to run the job, including the job JAR file, the configuration file and the computed input splits, to the jobtracker’s filesystem in a direcotry named after the job ID（step 3）。
5. Tells the jobtracker that the job is ready for execution（step 4）。

##### Job Initialization

To choose a reduce task the JobTracker simply takes the next in its list of yet-to-be-run reduce tasks, since there are no data locality considerations. For a map task, however, it takes account of the TaskTracker’s network location and picks a task whose input splits is as close as possible to the tasktracker. In the optimal case, the task is data-local, that is , running on the same node that the split resides on. Alternatively, the task may be rack-local: on the same rack, but not the same node, as the split.