这是一个完整的 MapReduce 分布式计算框架实现,基于 MIT 6.5840 分布式系统课程实验Lab1。本项目实现了 Google MapReduce 论文中描述的核心架构,包括任务调度、故障恢复和并行处理等功能。
6.5840/ ├── src/ # 源代码目录 │ ├── go.mod # Go模块定义 (Go 1.22) │ ├── main/ # 主程序目录 │ │ ├── mrcoordinator.go # 协调器启动程序 │ │ ├── mrsequential.go # 顺序MapReduce实现(参考) │ │ ├── mrworker.go # Worker启动程序 │ │ ├── reset.sh # 环境重置脚本 │ │ ├── test-mr-many.sh # 多轮测试脚本 │ │ ├── test-mr.sh # 主测试脚本 │ │ └── pg-*.txt # 8个测试文本文件 │ ├── mr/ # 核心MapReduce实现 │ │ ├── coordinator.go # 协调器实现(实际编写组件) │ │ ├── rpc.go # RPC通信协议(实际编写组件) │ │ └── worker.go # Worker实现(实际编写组件) │ └── mrapps/ # MapReduce应用插件 │ ├── wc.go # 单词计数应用 │ ├── indexer.go # 文本索引应用 │ ├── crash.go # 故障测试应用 │ ├── nocrash.go # 稳定版本应用 │ ├── early_exit.go # 早期退出测试 │ ├── jobcount.go # 任务计数测试 │ ├── mtiming.go # Map并行时序测试 │ └── rtiming.go # Reduce并行时序测试 └── .gitignore # Git忽略文件配置
文件位置: src/mr/coordinator.go
功能:
关键特性:
文件位置: src/mr/worker.go
功能:
关键特性:
文件位置: src/mr/rpc.go
功能:
统计文本文件中每个单词的出现次数。经典的 MapReduce 入门应用。
(word, "1") 键值对为文本文件创建倒排索引,支持快速文档检索。
(word, document) 键值对| 应用 | 功能 | 测试内容 |
|---|---|---|
| crash.go | 随机崩溃测试 | 验证系统容错性和故障恢复机制 |
| nocrash.go | 稳定版本 | 用于与 crash.go 对比验证 |
| early_exit.go | 早期退出测试 | 测试 worker 提前退出的处理 |
| mtiming.go | Map 并行时序测试 | 验证 Map 任务的并行执行 |
| rtiming.go | Reduce 并行时序测试 | 验证 Reduce 任务的并行执行 |
| jobcount.go | 任务计数测试 | 检测任务重复分配问题 |
项目包含 8 个经典文学文本作为测试数据:
| 文件 | 大小 | 内容 |
|---|---|---|
| pg-being_ernest.txt | 135KB | 《不可儿戏》奥斯卡·王尔德 |
| pg-dorian_gray.txt | 442KB | 《道林·格雷的画像》奥斯卡·王尔德 |
| pg-frankenstein.txt | 430KB | 《弗兰肯斯坦》玛丽·雪莱 |
| pg-grimm.txt | 527KB | 《格林童话集》格林兄弟 |
| pg-huckleberry_finn.txt | 580KB | 《哈克贝利·费恩历险记》马克·吐温 |
| pg-metamorphosis.txt | 135KB | 《变形记》卡夫卡 |
| pg-sherlock_holmes.txt | 568KB | 《福尔摩斯探案集》柯南·道尔 |
| pg-tom_sawyer.txt | 402KB | 《汤姆·索亚历险记》马克·吐温 |
总数据量:~3.2MB
# 进入源代码目录
cd /workspace/6.5840/src/main
# 编译所有应用插件
cd ../mrapps
go build -buildmode=plugin wc.go
go build -buildmode=plugin indexer.go
go build -buildmode=plugin crash.go
go build -buildmode=plugin nocrash.go
go build -buildmode=plugin early_exit.go
go build -buildmode=plugin jobcount.go
go build -buildmode=plugin mtiming.go
go build -buildmode=plugin rtiming.go
# 编译主程序
cd ../main
go build mrcoordinator.go
go build mrworker.go
go build mrsequential.go
# 清理之前的输出
rm -f mr-out-*
# 启动协调器(在窗口1)
cd /workspace/6.5840/src/main
./mrcoordinator pg-*.txt
# 启动 worker(在窗口2)
cd /workspace/6.5840/src/main
./mrworker ../mrapps/wc.so
# 查看结果
cat mr-out-* | sort | more
# 清理之前的输出
rm -f mr-out-*
# 启动协调器
cd /workspace/6.5840/src/main
./mrcoordinator pg-*.txt
# 启动 worker
cd /workspace/6.5840/src/main
./mrworker ../mrapps/indexer.so
# 查看索引结果
cat mr-out-* | sort | more
cd /workspace/6.5840/src/main
./mrsequential ../mrapps/wc.so pg-*.txt
# 进入测试目录
cd /workspace/6.5840/src/main
# 运行完整测试
./test-mr.sh
测试内容:
# 运行 N 轮测试检查系统稳定性
./test-mr-many.sh 3
# 或运行更多轮次
./test-mr-many.sh 10
# 清理所有生成的文件
cd /workspace/6.5840/src/main
./reset.sh
reset.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
ihash(key) 进行分区mr-X-Y,X=Map 任务 ID,Y=Reduce 任务 ID)mr-out-X,X=Reduce 任务 ID)go run -race 检测并发问题mr-X-Y (X=Map 任务 ID, Y=Reduce 任务 ID)mr-out-X (X=Reduce 任务 ID)"%v %v" (键 值)/var/tmp/5840-mr-uid项目提供了一个完整的 Docker 开发环境,基于 Ubuntu 24.04 和 Go 1.22.5:
# 构建镜像
docker build -t mapreduce-dev .
# 运行容器
docker run -it -p 8080:8080 mapreduce-dev
环境包含:
MIT 6.5840 分布式系统课程实验项目 基于 Google MapReduce 论文的经典分布式计算框架实现