MIT 6.824 Lab1 MapReduce实现思路

这篇博客详细介绍了MIT 6.824课程中Lab1 MapReduce的实现思路,包括关键问题、master和worker的实现、任务幂等性和避免任务重复执行的方法。此外,还探讨了功能抽象,提出了基于ACK响应的任务队列模型,以及设计的简单RPC接口。最后,展示了master和worker的结构与交互方式。
摘要由CSDN通过智能技术生成

关键问题

  1. 提供RPC接口,供worker调取文件(名)
  2. 确保每个文件都被worker正确消费,如果worker过了10s还没消费掉这个文件,则将这个文件给别人消费
  3. 在所有文件都被消费之后,通知每个worker结束任务
  4. 应该避免任务重复执行,包括map任务和reduce任务

master实现

  1. 在所有的任务都被完成后,等待10s,给每个前来要任务的worker发送一个特殊的reply,通知他们退出程序。
  2. master需要实现一个RPC函数,这个函数要求
    1. 上一次完成的工作,如果是第一次,则为nil。发请求总是带上上一次完成的任务,由master维护“任务被消费”的幂等性
  3. 先完成所有的map任务,当map任务全部被完成时,再给所有worker发布reduce任务。所以入参要指明是map任务还是reduce任务
  4. 入参包括自己上次完成的任务的函数名和函数的入参
  5. 出参包括要完成的函数名和函数的入参。exit是一个特殊的任务,表示要求worker退出
  6. 通过一个map来确认是否每个任务都被正确完成了。对任务生成hash512,作为key,值为false。当任务被完成时,改为true。每当一个任务被调取之后,起一个协程,睡眠10s,然后检查这个key。如果key的value为false,则把这个任务重新加到任务队列。

worker实现

  1. worker在彻底完成工作之前,应该将文件命名为标准文件名。

事后诸葛

功能抽象

从给出的样板代码和要求可以看出,这是一个生产者(master)消费者(worker)模型,且生产者要保障消费者正确消费。那么理所应当可以想到用一个带ACK响应的任务队列来实现这一功能,那么展示如何实现一个简单的消息队列。

在这个实验中,只有Map和Reduce两种函数,我们可以理解成,worker向master询问要执行什么函数,以及函数的参数。我们将这一部分做一个抽象,理解成wokrer向master要一个job,job包括了函数名,函数的参数,以及其他可能用得到的参数。

那么基本可以确定,我们要实现一个job的任务队列,并且任务队列根据ACK来确保任务被正确消费。以下只给出结构体和函数。具体实现不提。

package mr

import (
	"crypto/sha256"
	"encoding/json"
	"fmt"
	"log"
	"sync"
	"time"
)

//**************************************** job的定义 ****************************************
type Job struct {
   
	FuncName   string
	ParamsJson []byte
	CreatedAt  int64
}

// 生成的hash作为 ack 记录任务是否被响应的key
func (job *Job) Hash() [32]byte {
   }

func (job *Job) IsEmpty() bool {
   }

//**************************************** jobAck的定义 ****************************************
// 用一个map来记录没有ack的任务
// 之所以不用sync.Map,是因为那个是读多写少的时候性能好,但是目前的场景,读写差不多
// 额外提一句,这个jobAck只是维护了key是否在map中,并不关心job是啥,甚至是不是job,他关心的只有key
type jobAck struct {
   
	jobsDone map[[32]byte]bool
	lock     sync.Mutex
}

func NewJobAck() *jobAck {
   }

// map是否为空
func (ack *jobAck) IsAllAck() bool {
   }

func (ack *jobAck) IsAck(key [32]byte) bool 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值