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
$ go build -buildmode=plugin ../mrapps/wc.go

在main文件夹中,运行coordinator

1
2
$ rm mr-out*
$ go run mrcoordinator.go pg-*.txt

这里的pg-*.txt参数是输入文件;每个文件对应一个“split”,是一个Map任务的输入。

接着在一个新的窗口或者打开多个窗口来运行worker程序:

1
$ go run mrworker.go wc.so

当workers和coordinator完成的时候,查看输出文件mr-out-*,Lab完成的时候,输出文件排序应该是有序的,类似于这样:

1
2
3
4
5
$ cat mr-out-* | sort | more
A 509
ABOUT 2
ACT 8
...

最后运行测试脚本:

1
2
3
$ cd ~/6.5840/src/main
$ bash test-mr.sh
*** Starting wc test.

在coordinator无法正常结束的情况下,测试脚本会一直挂起。你可以在mr/coordinator.go文件的Done函数中将ret := false改为ret := true,这样协调器会立即退出。然后再次运行测试脚本

当完成之后,输出结果如下就是表示测试通过了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ bash test-mr.sh
*** Starting wc test.
--- wc test: PASS
*** Starting indexer test.
--- indexer test: PASS
*** Starting map parallelism test.
--- map parallelism test: PASS
*** Starting reduce parallelism test.
--- reduce parallelism test: PASS
*** Starting job count test.
--- job count test: PASS
*** Starting early exit test.
--- early exit test: PASS
*** Starting crash test.
--- crash test: PASS
*** PASSED ALL TESTS
$

实现思路

worker

master

rpc

思考

  • master如何去分配任务类型?比如是根据什么原因给某个worker分配map或者reduce任务的?

MIT6.824-Lab1-MapReduce
http://example.com/2023/10/16/MIT6-824-Lab1-MapReduce/
Author
John Doe
Posted on
October 16, 2023
Licensed under