MIT6.824-2022 分布式系统课程实验笔记 Lab 1 MapReduce--xunznux

Lab 1: MapReduce

Lab2:Raft

实验二Raft链接

Lab2A:Leader Election

lab2A链接

Lab2B:日志复制

lab2B链接

Lab2C :持久化机制 persistence

lab2C链接

Lab2D:日志压缩 log compaction

lab2D链接

我的代码实现(附带详细代码注释)

直达gitee链接
https://gitee.com/zhou-xiujun/xun-go/tree/master/com/xun/Mit-6.824-xun

介绍

在本实验中,将构建一个MapReduce系统。实现一个 worker 工作进程,该进程调用应用程序的Map和Reduce函数,并负责读写文件;还实现一个 coordinator 协调器进程,该进程分配任务给工作进程并处理失败的工作进程。将构建的系统类似于MapReduce论文中描述的系统。(注意:本实验使用“coordinator”而不是论文中的“master”。)

流程

基本结构

// RPC:
// 入参
type ExampleArgs struct {
   
   
   X int
}

// 响应
type ExampleReply struct {
   
   
   Y int
}

// RpcTask 在此处添加RPC定义
type RpcTask struct {
   
   
   Filename string  // 传入的保存上一步结果的文件名
   Status   JobType // 当前任务所处状态 MapTask 或 ReduceTask...
   Idx      int     // 当前任务的编码
   NReduce  int     // reduce 的数量
   NMap     int     // map 的数量
}

// 编写一个 unique-ish UNIX-domain 套接字名称
// 在 /var/tmp 中, 用于 coordinator。
// 不能使用当前目录,因为
// Athena AFS不支持UNIX域套接字
func coordinatorSock() string {
   
   
   s := "/var/tmp/824-mr-"
   s += strconv.Itoa(os.Getuid())
   return s
}
// JobType 定义一个新的类型 JobType,它是一个 int 类型
type JobType int

// iota 是 Go 语言中的一个常量生成器,可以在每个 const 声明块中自动递增
// 这些常量可以用来表示不同类型的任务状态
const (
	MapTask     JobType = iota // 0
	ReduceTask                 // 1
	WaitingTask                // 2
	FinishTask                 // 3
)

// Task 结构体包含文件存放位置,以及任务的类别
type Task struct {
   
   
	Filename  string
	Status    JobType
	StartTime time.Time
}

type Schedule int

const (
	MapSchedule    Schedule = iota // 0
	ReduceSchedule                 // 1
	FinishSchedule                 // 2
)

// ByKey 用于通过key排序
type ByKey []KeyValue

// 用于通过key排序

func (a ByKey) Len() int {
   
    return len(a) }
func (a ByKey) Swap(i, j int) {
   
   
	a[i], a[j] = a[j], a[i]
}
func (a ByKey) Less(i, j int) bool {
   
   
	return a[i].Key < a[j].Key
}

方法调用

mrcoordinator.go -> main() -> MakeCoordinator() -> coordinator.server() -> http.Serve()
																		-> heartbeat()
 												-> for Done() == false
mrworker.go -> mr.Worker(mapF, reduceF) -> 轮询获取任务 for GetMasterTask()
						case MapTask -> WorkerMap(MapF, task) -> mapF()
															  -> WorkerDoneCall(task) -> WorkerDone()
						case ReduceTask -> WorkerReduce(ReduceF, task) -> reduceF()
									
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值