MapReduce工作流程

张开发
2026/5/18 17:45:04 15 分钟阅读
MapReduce工作流程
总体流程输入数据(Input)→逻辑切片(Split)→Map映射→Shuffle阶段→Reduce阶段→输出数据(Output)输入阶段核心框架将HDFS上的文件切分为多个逻辑切片。分片规则默认和HDFS块大小一致为128MB。输入格式将每行的数据以行号行内容的键值对进行解析输入。Map阶段输入每个切片对应一个Map任务使用APITextInputFormat读取split的数据。其中k(偏移量) - v(行数据)。然后循环调用自定义的map()方法输出k-v调用k-v的分区计算。输出Map输出不是直接写入磁盘而是写入内存环形缓冲区(MapOutoutBuffer)。关键机制分区(Partitioning)默认是HashPartitioner根据key的哈希值hash(key) % numReduceTasks决定归属哪个Reduce任务。溢写(Spill)当缓冲区写入80%时就会触发溢写过程。读取k-v{分区号}对溢写范围内的数据进行一次快速排序。存放到本地磁盘文件中产生分区内的溢写文件。溢写完毕后会产生多个溢写文件。这时就会将多个溢写文件进行归并排序合并为一个有序文件。如果开启combiner那么当每个MapTask执行完毕之后本地磁盘每个分区内只有一个文件大幅减少磁盘 IO 和网络传输量。Shuffle阶段(Map端Reduce端)Map端的shuffle主要完成分区、排序、溢写、合并这些功能。Reduce端的shuff主要是进行copy、merge、sort功能。从各个MapTask节点下载拉取对应分区的结果文件然后将拉取的数据先存入内存缓冲区内存不足的话会写入磁盘再将内存和磁盘中的多个小文件进行归并排序合并成一个有序的大文件其中的排序分组是将相同key的所有value值聚合到一起形成key,Iterablevalue的结构作为Reduce函数的输入。Reduce 阶段将处理好的key,Iterablevalue执行用户自定义的reduce()方法遍历value列表进行聚合、统计等计算,生成最终的key,value。然后将结果写入HDFS的最终输出目录。输出数据框架调用OutputFormat将Reduce输出写入HDFS。输出的文件不可更改但是支持多种存储系统(HDFS、Hive、Hbase等)。以WordCount为例流程演示假设输入文件:hello li hello leisplit文件拆分为一个分片。Map输入0,hello li hello lei输出hello,1li,1hello,1lie,1Shuffle分区hello进入分区0li进入分区1lei进入分区0。排序合并分区0变为hello,(1,1)分区1变为li,(1)。Reduce输入hello,Iterable[1,1]li,Iterable[1]输出hello,2li,1输出数据写入HDFS结果为hello 2、li 1。

更多文章