MIT 6.824 Lab1 MapReduce

概述

本文章主要讲述lab1的基本实现思路,具体的实验要求见MIT-Lab1。实验代码见Lab代码

基本需求

  • 一个Coordinator管理多个Worker,通过RPC进行通信
  • Worker向Corrdinator请求任务,Coordinator向Worker分配任务
  • Coordinator能够处理Worker Crash

基本数据结构

Coordinator

type Coordinator struct {
   
	// Your definitions here.
	nReduce     int
	nMap        int
	workerLists sync.Map
	startReduce chan bool

	// MapTask
	muMapTask       sync.Mutex
	mapTaskNeedExec int
	mapTaskLists    []*MapTask
	mapTaskQueue    chan *MapTask

	// ReduceTask
	muReduceTask       sync.Mutex
	reduceTaskNeedExec int
	reduceTaskLists    []*ReduceTask
	reduceTaskQueue    chan *ReduceTask
}

workerLists用来管理Worker所有Worker的状态,mapTaskQueue和reduceTaskQueue为并发队列,用于Worker并发获取任务,mapTaskLists和reduceTaskLists用于存储所有的Task。

Worker

type worker struct {
   
	id       string
	nReduce  int
	needExit chan bool
}

needExit同于判断当前Worker是否可以退出,即所有任务已经完成。

具体功能

Worker注册

每个Worker新加入集群时,都要向Coordinator发起注册,Coordinator收到注册请求后,会进行合法性判断,如果合法则加入到workerLists中

// worker.go
func (w *worker) register() {
   
	w.id = strconv.Itoa(os.Getpid())
	reply := RegisterReply{
   }
	args := RegisterArgs{
   WorkerID: w.id}
	call("Coordinator.Register", &args, &reply)
	w.nReduce = reply.ReduceNum
}

// coordinator.go
func (c *Coordinator) Register(args *RegisterArgs, reply *RegisterReply) error {
   
	workerID := args.WorkerID
	_, exist := c.workerLists.Load(workerID
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值