MapReduce工作流程

MapReduce的工作流程包括Client阶段,MapTask阶段和ReduceTask阶段。Client根据split参数确定分片大小,生成执行文件清单;MapTask阶段进行输入流准备、map操作,包括数据读取、分区、排序和溢写;ReduceTask阶段执行shuffle、merge和reduce操作,其中shuffle阶段拉取Map结果,merge阶段按Key分组,reduce阶段对分组数据进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Client

1、根据用户配置的 split.min 和 split.max ,还有文件的 BlockSize 确定最终的 split 分片大小。

2、输出执行文件清单格式:

清单格式
fileorderoffsetsizelocations
file1104139
 244257
 。。。     

二、MapTask

1、准备阶段:

准备输入流,准备文件读取器 LineRecordReader 。从HDFS拉取文件, seek 到 split 的偏移位置,再向下一行(避开第一行,第一行有可能被切分),然后开始 for 循环每次读取文件的一行, 按 inputFormat 的要求做成 <k,v> 的格式。

2、map阶段:

每个 <k,v> 对执行一次 map 方法,同时给 <k,v> 分区,通过 newOutputCollector.write() 把 <k,v> 变成 <k,v,p> ,之后存进一个环形 buffer ,当环形 buffer 存到 80% 开始溢写, 溢写之前先 QuickSort (提前执行了一部分 reduce 的功能, 可以减少 reduce 时的磁盘i/o, 这也是整个框架体系中,唯一由乱序到有序的排序过程,其他地方的排序都是归并了),溢写之前还要看有没有 combiner ,有的话做 combiner  (提前执行了一部分 reudce 的功能,可以数据量,从而减少网络I/O),之后就可以把这些数据溢写到磁盘上,最后在磁盘上按照不同分区做 merge,merge 成一个内部有序的大文件,等待 reduce 拉取。

三、ReduceTask

1、shuffle阶段:

拉取 Map 阶段的结果。

2、merge阶段:

一边拉取 Map 的结果,一边就进行 merge,merge 时根据配置的 Group Comparetor (没有的话用 Sort Comparetor, 也没有的话用 Key Comparetor),按 Key 进行分组, 直到 merge 结束。

3、reduce阶段:

reduce 时,每次针对一组数据进行 reduce 操作(但是这时并没有从磁盘取出这一组数据,只是获取到一个迭代器作为迭代的起始点),之后在 reduce 操作的内部,会使用刚获取的迭代器进行循环迭代,每次取出一条数据进行处理。如此反复循环直至 reduce 全部执行完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值