MIT 6.5840 分布式系统 Lab 1: MapReduce

背景

A Tour of Go来来回回刷了好几遍,但还是没能熟练使用Go,究其原因还是工作上主要是用Python,没有用Go写过项目。
偶然在知乎看到MIT 6.5840 分布式系统这门课程,课程实验是用Go语言基于Raft协议实现一个K/V系统。
写这个文章是为了督促自己学完这门课,独立完成所有实验,希望学完之后能熟练掌握Go语言吧。

实验资料

MapReduce论文: https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf
手册:https://pdos.csail.mit.edu/6.824/labs/lab-mr.html
代码:git://g.csail.mit.edu/6.5840-golabs-2024

实现

这个实验相对来说比较简单,基础框架已经搭好,手册中给的提示也很多,只需实现coordinator.go, worker.go, rpc.go即可。

Coordinator

Coordinator负责任务调度,把任务分配给空闲的Worker,如果任务长时间未完成(10S)分配给新的Worker。代码主要分为两部分:

  1. 一个循环每1S检查所有任务的状态,把长时间未完成的任务重设为未分配状态。
  2. 处理来自Worker的RPC调用,分配任务给空闲的Worker,更新任务状态。

Worker

Worker负责执行任务,空闲时每间隔1S就向Coordinator请求任务。

注意点:

  • 要对Map和Reduce返回的数据排序,确保同一个任务运行多次结果是幂等的。
  • 在写入输出文件时可能出现竞争,例如WorkerA长时间未完成任务,Coordinator把任务又分配给另一个WorkerB,最终导致两个Worker可能同时写入输出文件,为处理此问题,简便方法是在用os.CreateTemp创建临时文件,完成写入数据后,再用os.Rename原子操作重命名文件。

代码:https://github.com/tlxxzj/6.5840-Distributed-Systems/tree/lab1-mapreduce/src/mr

结果

bash test-mr-many.sh 100
*** Starting wc test.
--- wc test: PASS
....
*** Starting crash test.
--- crash test: PASS
*** PASSED ALL TESTS
*** PASSED ALL 100 TESTING TRIALS

已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注