mit 6.824 lab1 思路贴
前言
为遵守 mit 的约定,这个帖子不贴太多具体的代码,主要聊聊自己在码代码时的一些想法和遇到的问题。
这个实验需要我们去实现一个 map-reduce 的功能。实质上,这个实验分为两个大的板块,map 和 reduce 两个阶段,也就是这个实验的核心部分,两个阶段都包含若干小的子任务,然后用户通过编写 map 和 reduce 函数。这个实验里,我们的任务是,读取 main 文件夹下的八个 txt 文档,扫描其中的单词,并计数,将结果输出到若干个子文件中,最后的话,测试脚本会读取这八个文件,把里面的结果输出到另一个 txt 中并进行排序,比对给出的标准答案,来评判该实验是否通过。
做这个实验的前提是,已经读过这个实验配套的论文:mapreduce-osdi04.pdf (googleusercontent.com) 知道这个实验以及想要做这个实验的人多少都会有点手段上谷歌(当然,也可以去找国内转载的,看不懂的话就看中文的吧,实验文档也是。
Getting Started
当我们打开这个项目工程,我们阅读这个项目的所有文件,以及 lab1 中给出的提示,我们可以先试着运行以下部分代码,来看看我们最重要得到什么结果:
# 当前目录为 src/main
go build -race -buildmode=plugin ../mrapps/wc.go
rm -rf mr-out*
go run -race mrsequential.go wc.so pg*.txt
more mr-out-0
这个是一个单线程的 map-reduce,我们可以查看 mrsequential.go
的内容,大概了解下整个 map-reduce 的过程是怎样的。
然后,我们把目光聚集到以下文件中:
---main
|---mrworker.go
|---mrcoordinator.go
|---mrsequential.go
---mr
|---worker.go
|---coordinator.go
|---rpc.go
---mrapp
|---wc.go
后面我们在这个实验中很多内容都要参考这些文件的内容,其中包含一些函数的来源,其中,尤其 main/mrsequential.go
尤其重要。
实现 rpc 通信
如果说想要实现 map-reduce,那么第一步就是实现 worker 和 coordinator 的 rpc 通信,观察 mr 目录下的文件后,我们需要在 rpc.go
和 coordinator.go
中定义以下结构体 (目前仅实现 rpc 通信):
// coordinator.go
// 专门定义一个Task,用于coordinator向worker分发任务
type Task struct {
FileName string
}
// 这里声明coordinator相关的结构体
type Coordinator struct {
task Task
}
// rpc.go
// 这里参考了上面的两个Example
type TaskRequest struct {
X int
}
type TaskReply struct {
XTask Task
}
下一步要做的是,需要让 coordinator 和 worker 之间能够进行 rpc 通信。
实现两者之间的通信是完成这个实验的基础。
worker接收消息
worker 调用 coordinator 的获取任务函数,获取要处理的文件名,然后执行打开操作。
在构建中间体 intermediate
时,可以留意到 mrsequential.go
有提示:
// a big difference from real MapReduce is that all the
// intermediate data is in one place, intermediate[],
// rather than being partitioned into NxM buckets.
根据这个思路,相当于提示我们,在构建桶存放中间体时,可能会用到二维 NxM 的数组。
然后经过 map 处理后的键值对切片,需要进一步经过 json 处理,并且将这个结果分成 nReduce 份,存放的文件命名规则是 mr-X-Y
,其中 x 是 map 任务的序号,y 是 reduce 任务的序号。
在进行 reduce 任务时,读取结果也需要经过 json 处理,这里很多步骤都可以借鉴 mrsequential.go
,包括读取文件等。
在创建目标文件时,可以使用 ioutil.TempFile
来创建临时文件,最后再重新命名。
此阶段的结构体声明如下:
// coordinator.go
type Coordinator struct {
State int // 0 map 1 reduce 2 none
MapTask Task
ReduceTask Task
NumMapTask int
NumReduceTask int
MapTaskFinish chan bool
ReduceTaskFinish chan bool
}
type Task struct {
FileName string
IDMap int
IDReduce string
}
// rpc.go
type TaskRequest struct {
X int
}
type TaskReply struct {
XTask Task
NumMapTask int
NumReduceTask int
CurNumMapTask int
CurNumReduceTask int
}
实现 rpc 通信
根据文档的指引,我们首先要实现 coordinator 和 worker 之间的通信,我们看到 worker.go
中有 call 和 CallExample 两个函数,那也照葫芦画瓢,自己搞一个 CallGetTask,实现 rpc 通信。
Worker 申领 task
看着 Worker()
里的注释,有一行 CallExample()
,是需要我们在这个函数里调用自定义的 CallGetTask 函数来获取 coordinator 分发的 task,在 call 之前,我们先要给 coordinator 的成员 MapTask 初始化,在 MakeCoordinator
中,我们可以看到 files 和 nReduce 这两个参数,那就从这两个入手,进行简单的初始化后,我们尝试在 Worker 中输出,能够输出文件名就是阶段性胜利。
照抄 mrsequential.go
文档中有提到,可以随意借鉴 mrsequential 中的函数,那么,走起。不过也要看看注释和文档,可以创建一个 NxM 的桶,和利用 encoder 和 decoder 来处理中间产物。
向 coordinator 的报告
每执行完一个任务,就向 coordinator 报告,方便 coordinator 记录,当所有任务都执行完时,修改 Done
中的条件,解除阻塞。
其实,走到这一步,可以说这个 lab 完成一半了,剩下就是各种断点打印 debug。
如果在执行过程提示无法打开文件,那说明,map 或 reduce 任务完成个数的条件没有控制好,mrsequential.go
中规定了一共会生成 3 个 workers,无法打开文件,只可能是,并发申请 task 时,已经快要到 task 的容量数,没分配到的 worker 自然也就没有分配到 FileName 和 MapID,所以需要设置好这些控制条件
解决 crash
做完上面,7 个 test 就可以 pass 6 个了,剩下一个 crash 的,需要用到锁或原子变量方面的知识。在进行 GetTask 时,我们传递的参数,需要确保其原子性,不然会出现 data race 现象;同时,也要对超过 10s 的任务进行舍弃处理,这里我们加一个时间戳,来记录任务的完成情况和开始时间。
又考虑到在记录任务完成情况时,是一个并发状态,这里考虑使用 sync.Map
。在进行最后的 Done
之前,我们还要再定义一个检查函数,来遍历检查是否还有 crash 的任务。
参考链接
6.5840 Lab 1: MapReduce (mit.edu)
mit6.824分布式lab1-MapReduce(1)_哔哩哔哩_bilibili
mit 6.824 lab1 思路贴的更多相关文章
- MIT 6.824 lab1:mapreduce
这是 MIT 6.824 课程 lab1 的学习总结,记录我在学习过程中的收获和踩的坑. 我的实验环境是 windows 10,所以对lab的code 做了一些环境上的修改,如果你仅仅对code 感兴 ...
- 6.824 LAB1 环境搭建
MIT 6.824 LAB1 环境搭建 vmware 虚拟机 linux ubuntu server 安装 go 官方安装步骤: 下载此压缩包并提取到 /usr/local 目录,在 /usr/l ...
- MIT 6.824(Spring 2020) Lab1: MapReduce 文档翻译
首发于公众号:努力学习的阿新 前言 大家好,这里是阿新. MIT 6.824 是麻省理工大学开设的一门关于分布式系统的明星课程,共包含四个配套实验,实验的含金量很高,十分适合作为校招生的项目经历,在文 ...
- 《MIT 6.828 Lab1: Booting a PC》实验报告
<MIT 6.828 Lab1: Booting a PC>实验报告 本实验的网站链接见:Lab 1: Booting a PC. 实验内容 熟悉x86汇编语言.QEMU x86仿真器.P ...
- MIT 6.824 Lab2D Raft之日志压缩
书接上文Raft Part C | MIT 6.824 Lab2C Persistence. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src ...
- MIT 6.824 Lab2C Raft之持久化
书接上文Raft Part B | MIT 6.824 Lab2B Log Replication. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- MIT 6.824 Llab2B Raft之日志复制
书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- MIT 6.824学习笔记4 Lab1
现在我们准备做第一个作业Lab1啦 wjk大神也在做6.824,可以参考大神的笔记https://github.com/zzzyyyxxxmmm/MIT6824_Distribute_System P ...
- MIT 6.824 : Spring 2015 lab1 训练笔记
源代码参见我的github: https://github.com/YaoZengzeng/MIT-6.824 Part I: Word count MapReduce操作实际上就是将一个输入文件拆分 ...
- MIT 6.824学习笔记2 RPC/Thread
本节内容:Lect 2 RPC and Threads 线程:Threads allow one program to (logically) execute many things at onc ...
随机推荐
- MogDB/openGauss关于PL/SQL匿名块调用测试
MogDB/openGauss 关于 PL/SQL 匿名块调用测试 一.原理介绍 PL/SQL(Procedure Language/Structure Query Language)是标准 SQL ...
- mogdb里xlog相关的几个参数
openGauss/MogDB 3.0 闪回恢复测试 本文出处:https://www.modb.pro/db/411368 介绍 闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务 ...
- 墨水污染的一角qsnctfwp
题目附件 在图片中最直接的信息是电话号码,将号码输入到搜索引擎,可以得到该书的出版社为:高等教育出版社. 进入高等教育出版社官网 根据物料号前四位.版次时间.印次时间,在官网中进行图书查询. 结合字数 ...
- mysql 必知必会整理—sql 排序与过滤[三]
前言 简单整理一下MySQL的排序与过滤. 正文 我们查询出来的结果有时候是希望进行排序的,比如说: select product_name from products order by prod_n ...
- 浅谈TypeScript对业务可维护性的影响
前言 笔者认为, TypeScript是服务于业务的, 核心就是提高代码的可维护性. TypeScript是把双刃剑, 如果类型系统使用的不好, 反而会阻碍开发, 甚至最后就变成了anyScript. ...
- kolla-ansible部署OpenStack Train版技术方案
简单架构示意 项目目标 1. 实现容器化部署docker+ Ansible+openstack-tarin 2. 使用keeplived监控nova服务实现在单台服务器宕机的情况下能迅速切断连接减轻平 ...
- 07cj031,07CJ03-1图集免费下载
简介 07CJ03-1轻钢龙骨石膏板隔墙.吊顶图集是中国建筑标准设计研究院组织编写的一部针对轻钢龙骨.石膏板材料用于非承重隔墙.室内吊顶装修的装修.建造参考资料,为用户提供专业的建造参考 下载 有需要 ...
- 当 TiDB 与 Flink 相结合:高效、易用的实时数仓
简介: 利用实时数仓,企业可以实现实时 OLAP 分析.实时数据看板.实时业务监控.实时数据接口服务等用途.但想到实时数仓,很多人的第一印象就是架构复杂,难以操作与维护.而得益于新版 Flink 对 ...
- 一文说清linux system load
简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是 ...
- [FE] 关于网页的一些反爬手段的解析思路,比如 58 等
这里主要是贴一些资料,有兴趣的可以再深入研究,比如做一些自动化库. www.cnblogs.com/TRHX/p/11740616.html blog.csdn.net/DzzzzzZzzzz/art ...