MIT 6.824 2020 分布式系统 Lab1 Mapreduce 实验思路和代码分析
2020 Lab1 Mapreduce
实现代码:https://github.com/AlvinChe/MIT-6.824-2020-Distributed-Systems/
一、流程图
二、代码设计
1.1 对象设计
Master对象
* mapTask,Task类数组
* reduceTask,Task类数组
* intermediateFile,映射数组,保存中间文件
* nReduce,整数,记录每个map任务划分多少份
* masterState,记录master的状态
* end,标志master是否结束任务
Task对象
* type, 任务类型,map/reduce
* id, 任务id,唯一标志任务,并且与中间文件对应
* filename,map任务中对应的文件名
* state,任务状态,记录任务初始化,运行中,已完成等状态
* nReduce,一个文件map后产生多少个renduce文件
* file,产生的文件数
* time,每个任务设定时长,超时重启
1.2 函数设计
Master.go中函数
* makeMaster,启动一个master进程
* server,将进程注册到rpc中
* getTask,由于向worker分配任务
* updateTask,根据worker的请求,更新master中任务的状态
* updateMaster,检查master中任务的完成情况,从map任务切换到
* reduce任务,切换到结束状态
Worker.go中函数
* Worker,启动无限循环,不断向master发出请求
* MapTask,将master发来的文件,经过mapf处理,然后生成中间文件(nreduce*len(file)个)
* ReduceTask,将master发来的任务,对应的中间文件,合成一个最终结果(nreduce个)
三、实例代码分析
Master部分
1.1 流程分析
入口 main/mrmaster.go,调用了mr/master.go中的MakeMaster
输入参数是pg-* 八个txt文件,10代表每分文件分成10份处理
mr/master.go中的MakeMaster
第一步创建一个master实例,
第二步,对于输入的八个pg-*文件,把它们记在master的MapTask中
第三步,启动master的server;(server函数中先是利用rpc注册了master实例的服务,然后监听服务,开启http.Server进程
1.2 GetTask函数
1: 判断master状态
master初始状态时,对于mapTask中的每个文件,判断状态
如果map任务尚未初始化,将map任务初始化,将其状态设为处理中,并且设置时钟;返回nil
如果map任务处于处理状态,且超时5s,则重新设置时钟,返回nil
map任务处于完成状态,则处理下一个map任务;
所有map任务处理完毕,则返回reply信号,标志map任务完成
1.3 updateTask函数
1: 更新任务的状态,标志任务已完成
2: 更新master状态中的任务(mr/master.go中的 updateMaster函数)
1.4 updateMaster函数
检查master状态;
1:如果所有map任务没有完成,则还处于初始化的状态;
如果未完成则返回;
完成了,则修改状态为“完成map任务”,开始初始化设置reduce任务;
2:如果map任务完成,则检查redeuce任务状态
3:如果reduce任务完成,则设置master状态为完成
worker部分
2.1 入口函数:main/mrworker.go
1:获得参数;
2:加载mapf和reducef (已写好,在mrapp/wc.go中)
3: 启动mr/work.go中的Worker函数
Worker函数思路
1: 开一个无限循环
2: 循环中,首先获得一个任务(GetTask函数,代码在master.go中)
3: 判断任务状态,如果处理中,则跳过,进入下一个循环,否则继续
4: 判断任务类型,对于map任务,调用mapf函数(mr/worker.go中的MapTask函数),判断任务是否完成(mr/worker.go中的TaskCompare,调用master中的taskCompare函数)
2.2 MapTask函数
输入参数:mapf函数(wc.go),map任务实例
1: 打开文件,task.filename,获取文件内容
2: 调用mapf函数处理文件内容,获得kva;根据master设置的nreduce = 10,将结果存储在10个文件里
3: for循环,将kva分别存到10个中间文件中,intermediateFile中;
4: 由此完成了map分配的工作,接着将任务标志已完成,
2.3 ReduceTask函数
输入参数:reducef函数,reduce任务实例
1:将任务对应的nreduce个file文件获取到
2: 合并到同一个文件中,写入到新文件
四、实验结果
通过全部测试
五、参考资料
课程主页:https://pdos.csail.mit.edu/6.824/schedule.html
课程视频:https://www.bilibili.com/video/av87684880
实验一:https://pdos.csail.mit.edu/6.824/labs/lab-mr.html
参考代码:https://github.com/nercoeus/MIT-6.824-2020-Distributed-Systems
下一篇: 初至上海滩 生活游戏工作Blog