MIT6.824-Lab1-MapReduce
背景
这个Lab主要是参考了MapReduce这篇论文实现的,所以只需要读懂了MapReduce中2-3章节就可以了。我们需要实现worker,他主要有两个任务分别是Map和Reduce,来分别读取和写入文件。同时还有一个coordinator ,它有两个任务: 分配任务给worker和处理失败任务。Lab还给出了一个参考代码:mrsequential.go。
任务
Lab要求我们实现一个分布式MapReduce,在之前背景中也介绍了:
- coordinator
- worker
我们只需要实现一个coordinator就好,但是有一个或多个并行运行的worker。在真实的分布式系统中,worker都是分布在不同的机器上面。但是在这个Lab中所有的程序都运行在一台机器上。worker想要通过远程调用(RPC)和coordinator进行通信。每个worker都会向coordinator请求任务从一个或多个文件中读取任务的输入数据,执行任务,然后将任务的输出写入一个或多个文件。如果一个worker没有在合理时间内完成任务(在这个Lab中,规定为十秒),coordinator应该能够察觉到,并将同样的任务分配给另一个worker。
我们需要修改以下代码来完成实验:
- mr/coordinator.go
- mr/worker.go
- mr/rpc.go
验证
完成代码之后,我们需要验证是否正确。首先需要构建word-count插件:
1 |
|
在main文件夹中,运行coordinator
1 |
|
这里的pg-*.txt
参数是输入文件;每个文件对应一个“split”,是一个Map任务的输入。
接着在一个新的窗口或者打开多个窗口来运行worker程序:
1 |
|
当workers和coordinator完成的时候,查看输出文件mr-out-*,Lab完成的时候,输出文件排序应该是有序的,类似于这样:
1 |
|
最后运行测试脚本:
1 |
|
在coordinator无法正常结束的情况下,测试脚本会一直挂起。你可以在mr/coordinator.go
文件的Done
函数中将ret := false
改为ret := true
,这样协调器会立即退出。然后再次运行测试脚本
当完成之后,输出结果如下就是表示测试通过了:
1 |
|
实现思路
worker
master
rpc
思考
- master如何去分配任务类型?比如是根据什么原因给某个worker分配map或者reduce任务的?