mit6.824 Lab1 MapReduce

lab1 MapReduce

前置知识

Golang语法及rpc相关

环境搭建

任务文件下载:详见任务书

git clone git://g.csail.mit.edu/6.5840-golabs-2023 6.5840

安装Golang环境(如果已有Golang环境,推荐卸载):

wget -qO- https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz | sudo tar xz -C /usr/local

如果还是失败,尝试更新路径:

vim ~/.bashrc
export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc

任务说明

给定若干个文本文件,识别单词统计个数,并输出到文件 mr-out-0

形如:

A 1
B 23
...
Z 456

文件解释

下列给出本实验重要的相关文件:

src
├── go.mod
├── go.sum
├── kvraft
├── labgob
├── labrpc
├── main
│   ├── crash.so
│   ├── diskvd.go
│   ├── lockc.go
│   ├── lockd.go             
│   ├── mrcoordinator.go            入口函数:调用coordinator
│   ├── mrsequential.go             示例函数:用来测试、参考
│   ├── mrworker.go                 入口函数:调用worker
│   ├── pbc.go
│   ├── pbd.go
│   ├── pg-being_ernest.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           文件输入
│   ├── test-mr-many.sh             测试脚本
│   ├── test-mr.sh                  测试脚本
│   ├── viewd.go
│   └── wc.so
├── models
├── mr                              lab1需要修改的文件
│   ├── coordinator.go              *修改文件1
│   ├── rpc.go                      *修改文件2
│   └── worker.go                   *修改文件3
├── mrapps                          测试脚本载入的不同插件
│   ├── crash.go                    work会随机退出(最困难) 
│   ├── early_exit.go
│   ├── indexer.go
│   ├── jobcount.go
│   ├── mtiming.go
│   ├── nocrash.go
│   ├── rtiming.go
│   ├── wc.go                       正常版本(最简单)   
├── porcupine
├── raft
├── shardctrler
└── shardkv

指令解释

下面解释本实验出现的部分指令:

把wc.go加载成插件的形式,后续会在work.go里用到mapf和reducef就是这个文件提供的函数(map和reduce)

go build -buildmode=plugin ../mrapps/wc.go

自测的时候在两个终端分别输入以下两个指令,分别启动一个coordinator和worker用来测试(视情况而定,自己也可以启动多个worker)

go run mrcoordinator.go pg-*.txt
go run mrworker.go wc.so

运行测试脚本,多组数据(通过不同的plugin来实现)

会启动1个coordinator和3个worker进行测试

测试脚本会在终端打印PASS/FAIL来提示是否通过

bash test-mr.sh

由于单组测试不稳定(crash会随机退出),推荐最终使用多组测试验证是否完成lab1任务

bash test-mr-many.sh 10

注:测试脚本wait -n运行不了,修改成wait

任务目标

补全coordinator.go/worker.go/rpc.go的代码

生成mr-out-0,mr-out-1,mr-out-2…mr-out-nReduce-1共nReduce个文件

下标通过哈希区分,对应的字符串写入对应的文件里。哈希函数在worker.go里

coordinator.go:

1.预处理map任务:

假设文件数量为n,那就切分成n个任务,存入带锁任务队列

2.预处理reduce任务:

切分成nReduce个任务(这个参数由原代码提供),存入带锁任务队列

3.提供接口:给work提供任务

从任务队列里取任务,将相关参数下发给worker(如任务类型,任务下标等)

4.提供接口:接收work任务完成上报

打上任务完成的标记,如果map任务都完成,才开始发送reduce任务。如果在发送任务后没接收到work上报,将任务重新加入任务队列

worker.go:

1.通过rpc向coordinator请求任务

2.处理map任务:

假设任务编号为x(x范围0到n-1),生成mr-x-y个中间文件(如mr-x-0,mr-x-1…),y范围0到nReduce-1

其中y的生成法则是根据ihash(key)%nReduce而定的

3.处理reduce任务

假设任务编号是y,将所有的mr-x-y(x范围0到n-1)中间文件(如mr-0-y,mr-1-y…)整合成mr-out-y文件里

4.通过rpc通知coordinator任务完成

学习参考

lab1任务书(必看,根据这个来写的):https://pdos.csail.mit.edu/6.824/labs/lab-mr.html

提供一份任务书的翻译(但是推荐自己看原文):https://blog.csdn.net/hh1986170901/article/details/120262227

有图片的教程,帮助理解(没详细看过):https://blog.csdn.net/qq_34872231/article/details/130243535

视频理解,可能有一定帮助:https://www.bilibili.com/video/BV1rS4y1n7PC

能提供一定帮助:https://huaweicloud.csdn.net/63356224d3efff3090b54e4e.html

流程图

读取文件
map阶段
生成中间产物
reduce阶段
file1
coordinator
file2
file3
worker1
worker2
worker3
1-1
1-2
2-1
2-2
3-1
3-2
workera
workerb
output1
output2

注:所有的map阶段完成后,才执行reduce阶段

注:worker1和worker2和workera可以是同一个work进程,但是请求到了不同的任务(不同时),也是允许的

注:生成中间文件mr-x-y(严格来说应该从0-0开始),x的范围是0到文件数-1,y的范围是0到nReduce-1

coordinator流程图

有map任务
接收到post且无map任务
有reduce任务
接收到post且无reduce任务
coordinator开始
预处理map任务
预处理reduce任务
等待work请求map任务
发送map任务
等待work请求reduce任务
发送reduce任务
coordinator结束

注:每次在发送任务的时候,同时会起一个协程,确认是否有post返回

worker流程图

map任务
reduce任务
worker开始
向coordinator请求任务
调用map处理生成中间文件
调用reduce生成最终文件
通知coordinator任务完成
worker结束

可能的坑

极度推荐看任务书的Hints

十次测试都能通过一般就比较稳定了,一次大概要三分钟

源码

https://gitee.com/jiangnan1634605411/mit6.824

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MIT 6.824 课程的 Lab1 是关于 Map 的实现,这里单介绍一下实现过程。 MapReduce 是一种布式计算模型,它可以用来处理大规模数据集。MapReduce 的核心想是将数据划分为多个块,每个块都可以在不同的节点上并行处理,然后将结果合并在一起。 在 Lab1 中,我们需要实现 MapReduce 的基本功能,包括 Map 函数、Reduce 函数、分区函数、排序函数以及对作业的整体控制等。 首先,我们需要实现 Map 函数。Map 函数会读取输入文件,并将其解析成一系列键值对。对于每个键值对,Map 函数会将其传递给用户定义的 Map 函数,生成一些新的键值对。这些新的键值对会被分派到不同的 Reduce 任务中,进行进一步的处理。 接着,我们需要实现 Reduce 函数。Reduce 函数接收到所有具有相同键的键值对,并将它们合并成一个结果。Reduce 函数将结果写入输出文件。 然后,我们需要实现分区函数和排序函数。分区函数将 Map 函数生成的键值对映射到不同的 Reduce 任务中。排序函数将键值对按键进行排序,确保同一键的所有值都被传递给同一个 Reduce 任务。 最后,我们需要实现整个作业的控制逻辑。这包括读取输入文件、调用 Map 函数、分区、排序、调用 Reduce 函数以及写入输出文件。 Lab1 的实现可以使用 Go 语言、Python 或者其他编程语言。我们可以使用本地文件系统或者分布式文件系统(比如 HDFS)来存储输入和输出文件。 总体来说,Lab1 是一个比较简单的 MapReduce 实现,但它奠定了 MapReduce 的基础,为后续的 Lab 提供了良好的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值