搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
算法构造者2
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Linux中批量创建用户的方法
2
Virtualbox安装Windows11教程,提供虚机专用镜像下载。_virtual box镜像下载
3
获取含有数字和大小字母的随机验证码(python)_python获取数字字母验证码
4
Spring系列之集成Druid连接池及监控配置_springdriud
5
jeston nano开发板 在ubuntu18.04环境下搭建的ROS和arduino小车
6
python入门教程(非常详细),从零基础入门到精通,看完这一篇就够了
7
nvidia docker安装和驱动安装_docker安装nvidia驱动
8
【网课平台】Day10.对接第三方:实现微信扫码登录_对接微信扫码登录
9
分享4个工具,轻松搞定PDF和图像中提取文本_python pdf图片转文字
10
并发编程(三大特性)-volatile_说一下并发编程的几个特性?
当前位置:
article
> 正文
【分布式】MIT 6.824 Lab1-MapReduce_mit 6.824 分布式系统: lab1
作者:算法构造者2 | 2024-01-29 10:52:39
赞
踩
mit 6.824 分布式系统: lab1
文章目录
1. 概述
1.1 总览
1.2 要完成的工作
2. 设计
2.1 分析
2.2 工作顺序
3. 编码
4. 运行结果
4.1 执行代码
4.2 运行结果
5. 总结
参考
1. 概述
1.1 总览
首先,我们要清楚MapReduce的论文内容,有哪些部分,每部分干什么。这里放一张总览图,来自论文里面。
工作流程总览
输入文件进行
分片
;
由Master分配任务(Map或Reduce)给worker;
运行Map任务的worker读取分片内容解析为键值对,并将内容交给Map函数得到中间key/value输出缓存到内存中;(论文还会将数据写到本地磁盘持久化)
Master会记录上述数据的位置,然后每隔一段时间分配任务给Reduce的worker,然后worker通过RPC从磁盘读取中间key/value,并根据key进行排序,得到key对应的value集合,再交给Reduce函数并输出对应的文件,每个Reduce对应着输出一个文件。
1.2 要完成的工作
实验要求如下
要写两个程序,一个
coordinator
进程(其实就是Master)和多个并行执行的
worker
进程;
一些细节:
1.worker通过
RPC
和coordinator进行交流;
2.worker通过coordinator索要任务(读取输入文件,执行任务,输出结果到文件中);
3.coordinator会记录worker完成任务的时间,若超过10s,将会把任务分配给其他worker;
编写程序的要求
程序写在coordinator.go,worker.go和rpc.go中,不要动mrcoordinator.go,mrworker.go这两个文件。
2. 设计
2.1 分析
要求
nReduce对应的Reduce数及输出的文件数,也要作为MakeCoordinator()方法的参数;
Reduce任务的输出文件的命名为mr-out-X,这个X就是来自nReduce;
mr-out-X的输出有个格式要求,参照main/mrsequential.go,"%v %v" 格式;
Map输出的中间值要放到当前目录的文件中,Reduce任务从这些文件来读取;
当Coordinator.go的Done()方法返回true,MapReduce的任务就完成了;
当一个任务完成,对应的worker就应该终止,这个终止的标志可以来自于call()方法,若它去给Master发送请求,得到终止的回应,那么对应的worker进程就可以结束了。
提示
修改mr/worker.go的Worker(),发送RPC请求给coordinator要任务。然后修改Coordinator将还没有被Map执行的文件作为响应返回给worker。然后worker读取文件并执行Map方法函数,就如示例文件 mrsequential.go;
Map和Reduce函数加载来自插件wc.go,如果改了这些东西需要使用命令重新编译生成新的.so文件,尽量不要动这些东西;
中间文件的命名方式推荐为mr-X-Y,X对应Map任务Id,Y对应的Reduce任务Id;
为顺利存储中间数据,采用json,以便读取;
worker 的 map 部分可以使用ihash(key)函数(在worker.go 中)为给定的键选择 reduce 任务;
Coordinator作为一个 RPC 服务器,将是并发的;不要忘记锁定共享数据;
在所有Map任务完成后,Reduce任务才会开始,所以对应的worker可能会需要等待,那么可以使用time.sleep()或其他方法;
worker可能挂掉或其他原因崩了,Coordinator在这个实验中等待10s,超过时间将会分配给其他的worker;
您可以使用 ioutil.TempFile 创建一个临时文件,并使用 os.Rename 对其进行原子重命名;
test-mr.sh 运行子目录 mr-tmp 中的所有进程,因此如果出现问题并且您想查看中间文件或输出文件,请查看那里。您可以修改 test-mr.sh 以在测试失败后退出,这样脚本就不会继续测试(并覆盖输出文件)。
2.2 工作顺序
定义
相关数据结构
Map、Reduce任务的数据结构;
Coordinator的数据结构;
RPC通信的数据包;
(对于数据结构的定义,先做一个设计,可能有没有考虑到的,在实际编码中可以设计添加)
数据结构定义完了我们就开始
具体的任务编写
(我们按照MapReduce的业务顺序来)
(worker.go)worker.go中的
Worker()方法
,给Master发送任务请求,得到对应的响应标志并完成对应的响应;
(worker.go)完成获取Master响应标志后worker的
响应方法
,命名为
doMapTask
,
doReduceTask
;
(worker.go)
doMapTask
()方法的参数、返回值、任务逻辑等确定,并编写(参考mrsequential.go程序);
(worker.go)
doReduceTask
()方法的参数、返回值、任务逻辑等确定,并编写(参考mrsequential.go程序);
(coordinator.go)
MakeCoordinator
方法,创建一个Master;
(coordinator.go)响应worker请求并分配任务的方法,命名为
GetTask
;
(coordinator.go) 接收worker完成工作的通知方法,并将对应的任务做完成标记等,命名为
TaskDone
;
(coordinator.go)
collectTimeOutTasks
(),监控超时;
(coordinator.go)
Done
(),mrcoordinator.go中需要使用,判断程序是否完成;
3. 编码
详见GitHub
仓库
4. 运行结果
4.1 执行代码
运行实例程序分析
运行自己的程序
4.2 运行结果
我是将其输出到一个txt文件中,各部分截图如下
要测试崩溃恢复,您可以使用 mrapps/crash.go 应用程序插件。它在 Map 和 Reduce 函数中随机退出。
这里测试crash出问题,我看到的是一个Worker它一直在Waiting task…状态;
原因已经找到了,就是没有进入监控时间的程序。还没有好的解决方法。
5. 总结
遇到的问题
遇到一个天坑,真的惨,go是按照命名的首字母大小写区分public和private,我刚开始一直按照Java开发手册的规则命名,首字母都是小写,改了2个小时都没搞清楚是什么错,结果是程序相互直接方法和字段访问不到。
锁的设计是一个问题。由于第一次写go,我本来想的是一个监控时间的进程一直运行,然后它自己更新时间从而去判断哪些超时(详见代码),但是不知什么原因,反正运行久了这个进程就会终止,然后我只有参照【2】的代码,把这个线程改到分配任务时判断。
思考与总结
整体任务的框架其实已经在项目中搭建好了,开始着手做这个东西的时候,首先要明白MapReduce的
原理
,其次先看看lab的
说明
(在课程中有),然后把项目搞下来看看整个项目的构成
框架
,自己
要写哪些东西,缺什么,要定义什么
;
最难的东西是
设计数据结构
与
对应的方法
,因为这才是真正的核心流程与思想的体现,先把要写哪些数据结构设计好,可能刚开始字段有遗漏,但是后面实际编码中可以补充必要的字段。然后,要把有哪些方法想好,方法直接的逻辑,哪些方法之间有交互,然后他们的方法参数与返回值是什么。先把整个逻辑写下来再编码,否则可能东拼西凑代码到最后写得很乱。
最后就是
优化
,我认为有两点,
一是
对于
任务分配的策略
,有队列,有这里用的Map等等,可能不一样的方法的效果是不一样的,我使用Map是参照【2】,这样对于Task的增删改查都很方便,但是Map会以Key排序,会打乱请求的顺序;
二是****并发访问
,加锁的问题,这也是一个优化的点,对于并发的线程如监控时间我就只是采用了【2】的办法,因为我刚开始设想的实现出了问题,主要还是对go不熟,第一次用,有一些背后的逻辑不清楚,而且运行go一旦出错,相关资料网上真的是比较少。
参考
【1】
MIT 6.824 分布式系统 | Lab 1:MapReduce
【2】
MIT 6.824 Lab1
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/article/detail/42766
推荐阅读
article
【开源】基于
SpringBoot
的
教学
资源共享
平台
...
基于JAVA+Vue+
SpringBoot
+MySQL的
教学
资源共享
平台
,包含了课程管理、课程课件、授课中心、作业发布、...
赞
踩
article
Golang的
proto
buf
编译
环境搭建_
go
proto
编译
...
为了将
proto
文件
编译
为
go
文件,供GRPC试用,需要安装
proto
c
编译
器、以及
proto
c-gen-
go
、prot...
赞
踩
article
剑指
Offer11
旋转
数组
的
最小
数字(C++)_剑指
offer
11. 旋转
数组
的
最小
数字 c+...
其实_剑指
offer
11. 旋转
数组
的
最小
数字 c++剑指
offer
11. 旋转
数组
的
最小
数字 c++ ...
赞
踩
article
python
文件
操作中
r
,
w
,
a的使用方法介绍_
r
:、
w
...
r
: 读取
文件
,
若
文件
不存在则会报错
w
: 写入
文件
,
若
文件
不存在则会先创建再写入
,
会覆盖原
文件
a : 写入
文件
,
若
文件
...
赞
踩
article
GO
——
context
...
参考:https://lailin.xyz/post/go-training-week3-
context
.html。
GO
...
赞
踩
article
12.
Golang
中类
的
表示
与
封装
...
Golang
中类
的
表示
与
封装
12.
Golang
中类
的
表示
与
封装
...
赞
踩
article
跟着
pink
老师
前端
入门教程
-
day12
...
1. 音频标签和视频标签使用方式基本一致2. 浏览器支持情况不同3. 谷歌浏览器把音频和视频自动播放禁止了4.可以把视频...
赞
踩
article
零基础入门
Jetson
Nano——
Yolov5
+
TensorRT
+
Deepstream
_jetso...
yolov5
+tensorrt+deepstream嵌入式平台加速推理目标检测。_
jetson
yolov5
jetson
...
赞
踩
article
利用
Python
+
selenium
技术,实现
浏览器
基本操作
详解,代码有详细注释_
python
浏览器
...
首先,需要安装
selenium
库和对应的
浏览器
驱动程序。然后,需要下载对应版本的chromedriver,并将其添加到环...
赞
踩
article
布置到
linux
的
文件
,免费
的
Office
套件,如何在
Linux
中部署Only
Office
桌面文档编...
原标题:免费
的
Office
套件,如何在
Linux
中部署Only
Office
桌面文档
编辑器
如果您是Ubuntu用户(或者一...
赞
踩
article
Python
第十二章(
函数
)...
当调用
函数
的时候,解释器回到
函数
定义的地方去执行下方缩进的代码,再进行
函数
下的内容)在创建
函数
的时候用三引号进行引用说明...
赞
踩
article
golang
转换时指定多个
别名
_
go
json
别名
...
type Result
_
struct {ErrCode int32 thrift:"errCode,1" db:"er...
赞
踩
article
Python
中
的
yield
详细解释_
python
yield
的
作用...
Python
中
的
yield
详细解释_
python
yield
的
作用
python
yield
的
作用 ...
赞
踩
article
【收藏】
Spring
Boot
自定义启动
Banner
在线
生成
工具_
pringboot
banner
在...
https://www.bootschool.net/ascii_
pringboot
banner
在线
生成
工具pring...
赞
踩
article
ubuntu20.04
安装
无线
网卡驱动...
纯净的ubuntu是没有gcc和make的,所以如果没有有线网,一定要先连上网络,否则离线
安装
这些库,依赖处理会很麻烦。...
赞
踩
article
2024
第32届
中国
(
北京
)
国际
健康
产业
博览会
...
https://www.toutiao.com/article/7296033195396071951/?log_fro...
赞
踩
article
MyBatis
-
Plus02
条件构造器
QueryWrapper
、
UpdateWrapper
、Con...
MyBatis
-Plus中的条件构造器
QueryWrapper
、
UpdateWrapper
、Condition、Lamb...
赞
踩
article
Swift
和
Obje
c
tive
-C互相
调用
_
obje
c
tive
-
c
调用
swift
...
在
Swift
中使用
Obje
c
tive
-C官方文档桥接文件桥接文件是一个在
Swift
中
调用
OC类或方法的通道。
Swift
...
赞
踩
article
鸿蒙
开发
实战-手写
文心
一言
AI对话
APP
...
1.在ets目录下新建model文件夹2.新建TS File本文我们学习使用了基本组件的使用,网络请求以及状态管理,使用...
赞
踩
article
【
Python
】
01
快速
上手
爬虫
案例
一...
实战是最好的老师,直接
案例
操作,
快速
上手。【
Python
】
01
快速
上手
爬虫
案例
一 ...
赞
踩
相关标签
开源
spring boot
后端
golang
rpc
python
context
go
封装
继承
前端
html5
css
学习
开发语言
嵌入式硬件
计算机视觉
selenium
chrome
布置到linux的文件
numpy