欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MIT 6.824 2020 分布式系统 Lab1 Mapreduce 实验思路和代码分析

程序员文章站 2022-07-12 17:39:20
...


实现代码:https://github.com/AlvinChe/MIT-6.824-2020-Distributed-Systems/

一、流程图

MasterWorkerMakeMaster函数启动一个Master服务启动一个无限循环,向master询问1.1.通过rpc请求一个任务(GetTask)1.2.rpc返回master分配的一个map任务和一个master状态1.3.本地处理MapTask(生成nreduce个intermediateFile)1.4.请求更新Master中的map任务状态,Master更新map任务状态;updateTask函数更新master状态,updateMaster函数重复直到map任务分配完,len(文件)次wokrer节点中的开始处理reduce任务2.1.通过rpc请求一个任务(GetTask)2.2.rpc返回master分配的一个reduce任务和一个master状态2.3.本地ReduceTask(合成每个文件对应的intermediateFile)2.4.请求更新Master中的reduce任务状态Master更新reduce任务状态;updateTask函数更新master状态;updateMaster函数重复直到reduce任务分配完,共nReduce个3.1.通过rpc请求一个任务(GetTask)3.2.rpc返回一个master状态表明任务已完成任务结束MasterWorker

二、代码设计

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: 合并到同一个文件中,写入到新文件

四、实验结果

通过全部测试

MIT 6.824 2020 分布式系统 Lab1 Mapreduce 实验思路和代码分析

五、参考资料

课程主页: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

相关标签: 分布式系统