Lab 1: MapReduce
Lab2:Raft
Lab2A:Leader Election
Lab2B:日志复制
Lab2C :持久化机制 persistence
Lab2D:日志压缩 log compaction
我的代码实现(附带详细代码注释)
直达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()

最低0.47元/天 解锁文章

604





