MIT 6.824-2020/2021

记录MIT 6.824 labs中遇到的问题与分析

拖延症要不得,加油!网上有挺多做完的,得自己做一遍才知道如何

实验源码地址:https://github.com/fzhiy/MIT-6.824

Lab 1: MapReduce

1
2
3
go build -buildmode=plugin ../mrapps/wc.go #以插件开发方式编译wc.go代码
rm mr-out* #先删除当前的mr的输出文件,如mrsequential.go运行后生成的mr-out-0文件
go run mrsequential.go wc.so pg*.txt #wc.go(plugin file,动态库)是mrsequential.go的loadPlugin的参数 用于加载MapReduce函数

具体工作

你的工作是实现一个分布式的MapReduce,包括两个程序,master 和 worker。只有一个master进程 以及 一个或多个worker进程并行执行。在真实的系统中,工作人员将在许多不同的机器上运行,但在本实验室中,您将在一台机器上运行所有的worker。worker将通过RPC与master通信。每个worker进程将向master请求任务,从一个或多个文件读取任务的输入,执行任务,并将任务的输出写入一个或多个文件。如果一个worker没有在合理的时间内完成任务(对于这个实验室,使用10秒),master应该注意,并把同样的任务交给另一个worker。

开始已经给了一些代码。main/mrmaster.go和main/mrworker.go分别是master和worker 的主例程,不要修改这些代码。

应该在mr/master.go、mr/worker.go和mr/rpc.go中给出实现。

下面是如何在单词计数MapReduce应用程序上运行代码。首先,确保word-count插件是新构建的:

1
2
3
4
5
go build -buildmode=plugin ../mrapps/wc.go
## 在main目录 run master
rm mr-out*
go run mrmaster.go pg-*.txt #pg-*.txt是mrmaster.go的参数作为input files;每个文件对应一个split 是一个Map任务的输入

任务解读(来源:https://zhuanlan.zhihu.com/p/260752052)

测试时,启动一个master和多个worker,也就是运行一次mrmaster.go、运行多次mrworker.go

master进程启动一个rpc服务器,每个worker进程通过rpc机制向Master要任务。任务可能包括mapreduce过程,具体如何给worker分配取决于master

每个单词和它出现的次数以key-value键值对形式出现。map进程将每个出现的单词机械地分离出来,并给每一次出现标记为1次。很多单词在电子书中重复出现,也就产生了很多相同键值对。还没有对键值对进行合并,故此时产生的键值对的都是1。此过程在下图中mapper伸出箭头表示。

已经分离出的单词以键值对形式分配给特定reduce进程,reduce进程个数远小于单词个数,每个reduce进程都处理一定量单词。相同的单词应由相同的reduce进程处理。处理的方式和上面描述的算法类似,对单词排序,令单词在数组中处在相邻位置,再统计单词个数。最终,每个reduce进程都有一个输出,合并这些输出,就是Word Count结果。此过程在下图中箭头进入reducer、以及后面的合并表示。

img

MapReduce WordCount

图中,相同的单词由相同reducer处理。如第一个reducer接受单词A, B,最后一个reducer接受单词C

测试流程要求,输出的文件个数和参数nReduce相同,即每个输出文件对应一个reduce任务,格式和mrsequential的输出格式相同,命名为mr-out*。我们的代码应保留这些文件,不做进一步合并,测试脚本将进行这一合并。合并之后的最终完整输出,必须和mrsequential的输出完全相同。

查看测试脚本test-mr.sh,可以看到合并每个输出mr-out*的指令如下,将每个输出文件的每一行按行首单词排序,输出到最终文件mr-wc-all中。

1
sort mr-out* | grep . > mr-wc-all

故每个reduce任务不能操作相同的单词,在map流程中分离出的相同单词键值对应由同一个reduce流程处理。

Lab1实验关键函数与流程。(参考:https://zhuanlan.zhihu.com/p/260752052)

进入src/main目录,执行./test-mr.sh > ./test-mr.out

test-mr.out中出现“PASSED ALL TESTS” 则说明通过全部测试。

00.环境按照教材来

01.go编译wc.go报错

编译代码:go build -buildmode=plugin ../mrapps/wc.go

错误如下:

解决方法(来源-> 用户Superman2077

实测:

Lab 2: Raft

Lab 3: KV Raft

Final Project

Lab 4: Sharded KV

参考资料