昨天其实写了一部分Mapreduce的运行原理 见博客https://blog.youkuaiyun.com/weixin_42231373/article/details/85010279写了细节部分
今天以图的方式结合文字来捋捋思路
0) 用户提交任务 (含数据)
1) 集群首先对输入数据源进行切片
2) master 调度 worker 执行 map 任务
3) worker 读取输入源片段
4) worker 执行 map 任务,将任务输出保存在本地
5) master 调度 worker 执行 reduce 任务,reduce worker 读取 map 任务的输出文件
6) 执行 reduce 任务,将任务输出保存到 HDFS
细节大致如下 由上至下依次执行
用户提交任务job 给集群
切片 集群查找源数据 对源数据做基本处理
分词(每行执行一次map函数) 集群(yarn的appliction)分配map任务节点worker
映射 其中间数据(存在本地)
分区(partition) 中间数据
排序 (或二次排序) 中间数据
聚合(combine有无key聚合后key无序) 中间数据 分组(group) 发生在排序后混洗前(个人理解)
混洗(shuffle后key有序) 混洗横跨mapper和reducer,其发生在mapper的输出和reducer的输入阶段
规约(reduce) 集群(yarn的appliction)分配reduce任务节点worker
这里是一些补充
切片 不属于map阶段,但却是map阶段的输入,是集群对输入数据的解析处理
分词,映射,分区,排序,聚合 都属map阶段
混洗 横跨map阶段和reduce阶段,其发生在map阶段的输出和reduce的输入阶段
规约 属reduce阶段 规约结果是reduce阶段的输出,输出格式由集群默认或用户自定义
分词即map()函数的输入与map阶段的输入略有差别,他的输入是切片结果的kv形式,行号(偏移量)与行内容