首先将 block 块进行逻辑切片的计算,每个切片(split)对应一个 map 任务 切片是为了将 block 数量和 map 任务数量解耦。 map 读取切片数据,默认按行读取,作为键值对交给 map 方法,其中 key 是当前读取 的行在文件中的字节偏移量,value 就是读取的当前行的内容。 map 开始计算,自定义的逻辑。 map 将输出的 kv 首先写到环形缓冲区,在写之前计算分区号(默认按照 key 的 hash 值对 reducer 的个数取模)

环形缓冲区默认 100MB,阈值 80%,如果写入的 kv 对达到了 80%则发生溢写,溢写的 时候要先对键值对按照分区号进行分区,相同分区按照 key 的字典序排序,溢写到磁盘, 并发生 map 端归并操作。此时如果指定了 combiner,并且溢写的文件数量达到了三个或 三个以上,则按照 combiner 合并数据.当一个 map 任务完成之后,所有的 reducer task 向其发送 http get 请求,下载 它们所属的分区数据。 当所有 map 任务运行结束,开始 reduce 任务

在 reduce 开始之前,根据设定的归并因子,进行多伦的归并操作,非最后一轮的归 并的结果文件被存入到硬盘上,最后一轮归并的结果直接传递给 reduce,reduce 迭代计 算。reduce 计算结束后将结果写到 HDFS 文件中,每一个 reducer task 任务都会在作 业输出路径下产生一个结果文件 part-r-00xxx。同时执行成功时会产生一个空的 _SUCCESS 文件,该文件是一个标识文件。MR1->MR2->MR3