6.5840 Lab-mr 个人总结

78 阅读2分钟

6.5840 Lab-mr

6.5840 lab-mr

sequential mapreduce

项目中提供了一个简单的顺序 mapreduce 实现 src/main/mrsequential.go (mapreduce单线程版)。 它在单个进程中运行映射并逐个缩减。 我们还为您提供了几个 MapReduce 应用程序: mrapps/wc.gomrapps/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.goworker.go 将会有 只有一个coordinator进程,以及一个或多个worker同时运行。 在实际系统中,worker 将在一堆不同的计算机运行,但对于本练习,在一台计算机上运行它们。 工作人员将通过 RPC 与coordinator对话。 每个 worker 进程将 在 Loop 中,询问 任务的协调器从一个或多个文件中读取任务的输入, 执行任务,将任务的输出写入一个 或更多文件,然后再次向协调器请求 new 任务。 协调器应注意 worker 是否尚未完成 其任务在合理的时间内完成(对于本实验,请使用 10秒), 并将相同的任务分配给不同的 worker。

测试脚本

那么如何确认自己的程序是正确的呢?

运行main/test-mr.sh就可以测试我们写的程序是否正确.

  1. 第一个部分是编译文件,然后才开始测试
  2. 测WordCount
  3. 测Indexer
  4. 检测是不是多个map同时执行
  5. 检测是不是多个reduce同时执行
  6. 检测是不是8个map任务(有8个pg文件)
  7. 检测有没有进程早退
  8. 检测容错

我的架构

要通过官方的测试文件并不复杂,以下是大致的架构图

image.png

image.png

image.png

问题

在测试中遇到几个问题:

  1. 文件同步到虚拟机中无法运行,使用dos2unix
  2. 在测试early exit的时候,一直过不去,排查发现虚拟机bash没有wait -n指令, 需要修改测试脚本,使用mac的方案即可

在Windows运行代码

这个lab的代码如果要在windows上运行需要修改两个地方

  1. 修改插件机制,windows无法使用go 插件,可以直接将要用的map和reduce方法写死到mrworker文件里
  2. 修改rpc传输层实现,本来是用unix domain socket 在windows里可以修改成tcp localhost

这样就可以在windows调试,但是测试脚本还是得在虚拟机运行