6.5840 Lab-mr
sequential mapreduce
项目中提供了一个简单的顺序 mapreduce
实现 src/main/mrsequential.go
(mapreduce单线程版)。
它在单个进程中运行映射并逐个缩减。
我们还为您提供了几个 MapReduce
应用程序:
mrapps/wc.go
和 mrapps/indexer.go
cd ~/6.5840
cd src/main
go build -buildmode=plugin ../mrapps/wc.go
rm mr-out*
go run mrsequential.go wc.so pg*.txt
more mr-out-0
mrsequential.go
将其输出保留在 file mr-out-0
.输入来自名为 pg-xxx.txt
的文本文件。
这个mrsequential.go
项目是用wc.go
作为插件,
wc.go
中有map函数和reduce函数,
在mrsequential.go
中就会读取map和reduce函数运行(有点像Java中的SPI哈)
任务
我们的工作是实现一个分布式 MapReduce,它主要由两个程序构成,
coordinator.go
和 worker.go
将会有 只有一个coordinator进程,以及一个或多个worker同时运行。
在实际系统中,worker 将在一堆不同的计算机运行,但对于本练习,在一台计算机上运行它们。
工作人员将通过 RPC 与coordinator对话。
每个 worker 进程将 在 Loop 中,询问 任务的协调器从一个或多个文件中读取任务的输入,
执行任务,将任务的输出写入一个 或更多文件,然后再次向协调器请求 new 任务。
协调器应注意 worker 是否尚未完成 其任务在合理的时间内完成(对于本实验,请使用 10秒),
并将相同的任务分配给不同的 worker。
测试脚本
那么如何确认自己的程序是正确的呢?
运行main/test-mr.sh就可以测试我们写的程序是否正确.
- 第一个部分是编译文件,然后才开始测试
- 测WordCount
- 测Indexer
- 检测是不是多个map同时执行
- 检测是不是多个reduce同时执行
- 检测是不是8个map任务(有8个pg文件)
- 检测有没有进程早退
- 检测容错
我的架构
要通过官方的测试文件并不复杂,以下是大致的架构图
问题
在测试中遇到几个问题:
- 文件同步到虚拟机中无法运行,使用
dos2unix
- 在测试
early exit
的时候,一直过不去,排查发现虚拟机bash没有wait -n
指令, 需要修改测试脚本,使用mac的方案即可
在Windows运行代码
这个lab的代码如果要在windows上运行需要修改两个地方
- 修改插件机制,windows无法使用go 插件,可以直接将要用的map和reduce方法写死到
mrworker
文件里 - 修改rpc传输层实现,本来是用
unix domain socket
在windows里可以修改成tcp
localhost
这样就可以在windows调试,但是测试脚本还是得在虚拟机运行