N 个人去一个有 m 个坑位的大公共卫生间做清洁,该如何调度?这个实验的目标是实现一个分布式的 MapReduce 系统,包括协调器和工作进程,并确保它能正确处理并行任务、容错等情况。
<!-- more -->
## 资料
[6.5840 Lab 1: MapReduce (mit.edu)](https://pdos.csail.mit.edu/6.824/labs/lab-mr.html)
## 思想
[MapReduce](MapReduce.md)
## 文件解读
```sql
(base) liuyishou@MacBook-Pro-3 src % tree
.
├── go.mod
├── go.sum
├── kvraft
│ ├── client.go
│ ├── common.go
│ ├── config.go
│ ├── server.go
│ └── test_test.go
├── kvsrv
│ ├── client.go
│ ├── common.go
│ ├── config.go
│ ├── server.go
│ └── test_test.go
├── labgob
│ ├── labgob.go
│ └── test_test.go
├── labrpc
│ ├── labrpc.go
│ └── test_test.go
├── main
│ ├── diskvd.go
│ ├── lockc.go
│ ├── lockd.go
│ ├── pg-being_ernest.txt 0 pg*.txt是需要被统计单词数的原文件
│ ├── pg-dorian_gray.txt
│ ├── pg-frankenstein.txt
│ ├── pg-grimm.txt
│ ├── pg-huckleberry_finn.txt
│ ├── pg-metamorphosis.txt
│ ├── pg-sherlock_holmes.txt
│ ├── pg-tom_sawyer.txt
│ ├── wc.so 0 单词计数(Word Count)的MapReduce应用,它被编译成了一个Go插件。
│ ├── mrsequential.go 0 运行的是一个单体(单机)版本的 MapReduce。
│ ├── mr-out-0 0 是示例程序`go run mrsequential.go wc.so pg*.txt`的输出结果。
│ ├── mrcoordinator.go 1 多 worker 版本的 mapReduce
│ ├── mrworker.go
│ ├── pbc.go
│ ├── pbd.go
│ ├── test-mr-many.sh
│ ├── viewd.go
│ └── test-mr.sh 2 打分的脚本,用来测试你的作业的完成情况
├── models
│ └── kv.go
├── mr
│ ├── coordinator.go
│ ├── rpc.go
│ └── worker.go
├── mrapps
│ ├── crash.go
│ ├── early_exit.go
│ ├── indexer.go
│ ├── jobcount.go
│ ├── mtiming.go
│ ├── nocrash.go
│ ├── rtiming.go
│ └── wc.go
├── porcupine
│ ├── bitset.go
│ ├── checker.go
│ ├── model.go
│ ├── porcupine.go
│ └── visualization.go
├── raft
│ ├── config.go
│ ├── persister.go
│ ├── raft.go
│ ├── test_test.go
│ └── util.go
├── shardctrler
│ ├── client.go
│ ├── common.go
│ ├── config.go
│ ├── server.go
│ └── test_test.go
└── shardkv
├── client.go
├── common.go
├── config.go
├── server.go
└── test_test.go
```
## how to run
这个实验是关于实现 MapReduce 系统的。以下是运行这个实验的基本步骤:
1. 准备环境:
- 确保已安装 Go 语言环境。
- 克隆实验代码仓库:
`git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840`
2. 构建 MapReduce 应用:进入 src/main 目录,构建词频统计应用:
`cd src/main go build -buildmode=plugin../mrapps/wc.go`
3. 运行普通的顺序执行的版本(用于对比):
`rm mr-out* go run mrsequential.go wc.so pg*.txt`
输出将保存在 mr-out-0 文件中。
4. 运行分布式版本:
- 在一个终端窗口运行协调器(coordinator):
`rm mr-out* go run mrcoordinator.go pg-*.txt`
- 在一个或多个其他终端窗口运行工作进程(worker):
`go run mrworker.go wc.so`
5. 检查结果:当所有进程完成后,检查 mr-out-* 文件的输出。可以使用以下命令查看排序后的结果:
`cat mr-out-* | sort | more`
6. 运行测试脚本:使用提供的测试脚本来验证实现:
`bash test-mr.sh`