MapReduce思想
Map负责“拆分”:即将复杂问题拆分成可以并行计算的小问题,彼此之间几乎没有依赖联系。
Reduce负责对Map阶段的结果进行合并汇总
Map和Reduce的抽象接口如下:
map:(k1; v1) — (k2; v2)
reduce:(k2; [v2]) — (k3; v3)
一个完整的MapReduce程序在分布式运行时有三类
- MRAppMaster: 负责整个MR程序的过程调度以及状态协调
- MapTask: 负责map阶段的整个数据处理流程
- ReduceTask:负责reduce阶段的整个数据处理流程
WordCount编程实现思路
map阶段的核心:把输入的数据经过切割,全部标记为1
shuffle阶段核心:经过MR程序内部自带默认的排序分组功能,把key相同的单词作为一组数据构成新的kv对
Map阶段执行流程
MapReduce整体执行流程
- 切片(默认大小与文件块大小相同)
- 按行读取数据,返回<key, value>对
- map方法处理数据
- 根据reducetask数量对输出的键值进行分区partition
- 将输出数据写入内存缓冲区,达到比例则溢出spill到磁盘上,溢出的时候根据key值进行排序
- 对溢出文件进行最终的merge合并
Reduce阶段执行流程
- ReduceTask主动从MapTask复制拉取属于自己处理的数据
- 将获取的数据全部进行合并merge,即将分散的数据合并对合并的数据进行排序
- 对排序后的键值对调用reduce方法,键相等的键值对调用reduce方法,最后把这些键值对写入到HDFS文件中
shuffle概念
从Map产生输出开始到Reduce得到数据作为输入之前的过程称为shuffle
分为两个阶段:Map端的shuffle、Reduce端的shuffle
Map端的shuffle
Collect阶段:将MapTask结果收集到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认hash分区
Spill阶段:当内存的数据量达到一定阈值时,会将数据写入本地磁盘,写入前对数据进行一次排序操作
Merge阶段:把所有溢出的临时文件进行合并操作,确保MapTask最终只产生一个中间数据文件
Reduce端的shuffle
Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存本地的数据文件进行合并操作
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经进行局部的排序操作,所以ReduceTask阶段只需保证Copy数据的最终整体有效性
shuffle的弊端
涉及到数据在内存、磁盘间的多次往复