MIT6.824之MapReduce实现

MIT6.824之MapReduce实现

这篇文章主要是大致分析一下MapReduce的实现,具体代码见Github(https://github.com/iloveacm4/mapReduce)

首先,依照MIT的lab已经给出了大致代码。

我们的实现主要分为两个部分,master.go 和 worker.go。另外还定义了用于RPC的结构rpc.go

// Master 结构体
type Master struct {
	// Your definitions here.
	AllFilesName        map[string]int	  //记录文件名
	MapTaskNumCount     int
	NReduce             int               // 记录需要生成的Reduce task数量
	InterFIlename       [][]string        // intermediate file
	MapFinished         bool
	ReduceTaskStatus    map[int]int      // 记录Reduce状态
	ReduceFinished      bool              // 记录是否完成reduce,完成后任务结束
	RWLock              *sync.RWMutex
}

//两个chan用来存放map任务 和 Reduce任务
var maptasks chan string          // chan for map task
var reducetasks chan int          // chan for reduce task
//master.go

//前期准备工作

func MakeMaster(files []string, nReduce int) *Master {} //初始化Master结构体,开启server服务,会调用master.server()

func (m *Master) server() {} //注册RPC,调用generateTask()产生任务,等待worker发来的任务请求

func (m *Master) generateTask() {} //将Master结构体中AllFileName所有文件加载入 maptasks, 再处理完成后,再加载reduce任务进入reducetasks


// 接受远程调用,为worker分配任务

func (m *Master) MyCallHandler(args *MyArgs, reply *MyReply) error {} //负责接受worker发来的请求,有三种请求MsgForTask,
//一是请求任务,请求map任务以及请求reduce任务,根据不同的请求作不同的处理。需要设置reply为相应的值。并且运行一个守护协程timerForWorker()
//二是请求结束map任务MsgForFinishMap,用来通知master map任务结束。设置AllFileName[filename]为Finished状态
//三是请求结束reduce任务MsgForFinishReduce。同样需要设置ReduceTaskStatus[index]为Finished状态


func (m *Master)timerForWorker(taskType, identify string){} //设置定时器为10秒,10秒内完成了任务,则设置相应的任务为Finished
//否则重新将任务设置为未完成状态并加入相应的任务队列

//worker.go

func Worker(mapf func(string, string) []KeyValue, 
            reducef func(string, []string) string) {} //主函数,死循环,不断地调用CallForTask()函数请求任务,并根据master分配的
												  //任务类型调用mapInWorker(), 或者reduceInWorker()


func CallForTask(msgType int,msgCnt string) MyReply {} // 调用RPC,返回请求到的任务


func mapInWorker(reply *MyReply,mapf func(string, string) []KeyValue) {} 
//调用mapf做map任务, 并调用WriteToJSONFile()写入JSON文件中,																   
//调用SendInterFiles,表明已处理到中间状态																  
//并调用CallForTask(MsgForFinishMap, reply.Filename)表明结束该任务

func reduceInWorker(reply *MyReply, reducef func(string, []string) string) {} 
//与mapInWorker同理
//统计的原理是按照key排序,然后遍历统计

func SendInterFiles(msgType int, msgCnt string, nReduceType int) MyReply {}
//发送中间文件到master表明位置
posted @ 2022-03-18 16:47  iloveacm  阅读(73)  评论(0编辑  收藏  举报