热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mit6.824lab1

环境指导书,认真看https:pdos.csail.mit.edu6.824labslab-mr.html要求golang1.15那就用那个版本我开始尝试使用1.1

环境

指导书,认真看 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html
要求golang1.15 那就用那个版本
我开始尝试使用1.17发现gobuild不通过
在windows的goland上编代码, 在远程linux服务器(或者虚拟机)上执行。没有mac的可以尝试远程目录挂载。
windows挂载远程目录
实验是做完了,这里写一写过程,整理一下思路
在这里插入图片描述


过程


  1. 首先认真读了mapreduce的论文,因为以前本科也上过课,研一也上过,所以对于mr的过程还是算熟悉。

  2. 认真读指导书

  3. 按指导书跑一遍 sequencial-mr的例子

  4. 根据指导书和论文,需要做的事情是实现coordinator和worker的通信,(blacklive matters!)这里没用master了。coordinator里面用一些数据结构mutex或者channel控制不同worker的互斥访问,控制map任务和reduce任务的状态,map任务产生的中间文件的位置等。根据论文里面说的3种状态,Idle,inprogress,complete.这里我用了比较简单的数据结构。因为这个实验的输入文件都不是很大,不像gfs实验中需要split为16-64MB,所以直接一个map任务对应一个输入文件,因此将文件名作为了任务名,map的key。reduce任务名则根据mrcoordinator.go指定的nreduce数量决定,用数字代替。TaskStatus是枚举,三种任务状态。结构比较简单,刚开始想着要是数据结构不够用后面再加,但是好像做下来都没改过。

修改这三个文件
在这里插入图片描述

type Coordinator struct {mapTasks map[string]TaskStatusreduceTasks map[string]TaskStatusreduceFiles map[string][]string //中间文件位置mapCompleted bool MapCompleteNum int //完成了多少个mapnReduce int done boolmutex sync.Mutex
}

master初始化

func MakeCoordinator(files []string, nReduce int) *Coordinator {c :&#61; Coordinator{map[string]TaskStatus{},map[string]TaskStatus{},map[string][]string{},false,0,nReduce,false,sync.Mutex{},}// Your code here.for _, fileName :&#61; range files {c.mapTasks[fileName] &#61; Idle}for i :&#61; 0; i < nReduce; i&#43;&#43; {c.reduceTasks[strconv.Itoa(i)] &#61; Idlec.reduceFiles[strconv.Itoa(i)] &#61; []string{}}c.server()return &c
}

worker申请任务

他给的demo里面有example rpc调用的例子&#xff0c;在rpc里定义自己的请求体和响应体的结构&#xff0c;这也是rpc通信的风格。grpc开发app就是先定义protobuf消息格式。
我做的过程中定义的函数没有返回error&#xff0c;好像不行&#xff0c;需要保持和example一样。
coordinator&#xff08;master&#xff09;分配任务的同时&#xff0c;给对应的任务加一个过期时间&#xff0c;实验要求的是10s。
超时处理的时候&#xff0c;刚开始没看指导书的hints&#xff0c;后来发现里面建议使用ioutils.TempFile&#xff0c;因为测试过程中会测试当某个worker crash掉的时候&#xff0c;程序会怎么办&#xff0c;A worker超时了&#xff0c;分给另一个worker B&#xff0c;A写了一半的文件就失效了&#xff0c;因此应该用临时文件&#xff0c;最后返回的时候写入成功了才改成本应的文件名。
这里map的中间产物我命名很随意&#xff0c;直接文件名*n&#xff0c;n代表作为哪一个reduce的输入&#xff0c;n是由key 哈希后 取模得到的。


func (c *Coordinator) GetTask(request *ExampleArgs, reply *GetTaskReply) error {c.mutex.Lock()defer c.mutex.Unlock()if !c.mapCompleted { //分配map任务for fileName, status :&#61; range c.mapTasks {if status &#61;&#61; Idle {c.mapTasks[fileName] &#61; InProgressreply.MapName &#61; fileNamereply.NReduce &#61; c.nReducereply.TaskType &#61; MapTypego c.HandleMapTimeout(fileName)return nil}}reply.TaskType &#61; Sleep} else {for reduceName, status :&#61; range c.reduceTasks {if status &#61;&#61; Idle{c.reduceTasks[reduceName] &#61; InProgressreply.ReduceFiles &#61; c.reduceFiles[reduceName]reply.TaskType &#61; ReduceTypereply.ReduceName &#61; reduceNamego c.HandleReduceTimeout(reduceName)return nil}}reply.TaskType &#61; Sleep}return nil}

worker上报任务完成

map和reduce完成后同样rpc调用&#xff0c;报告master完成了任务&#xff0c;每次上报master都判断map阶段和reduce阶段是否完成&#xff0c;主程序中有一个判断整个程序是否完成的逻辑&#xff0c;done&#xff08;&#xff09;

func (c *Coordinator) ReduceReport(req *ReduceCompleteReq,reply *ExampleReply) error{c.mutex.Lock()defer c.mutex.Unlock()c.reduceTasks[req.ReduceName] &#61; Completed//fmt.Fprintf(os.Stderr, "####reduce完成 "&#43;req.ReduceName&#43;"\n")fmt.Fprintf(os.Stderr, "####reduce完成&#xff0c; "&#43;req.ReduceName&#43;"############### \n")done :&#61; truefor _,status :&#61; range c.reduceTasks{if status !&#61; Completed{done &#61; falsebreak}}c.done &#61; donereturn nil
}

差不多就这些&#xff0c;实现进程同步还可以用channel

遇到的两个坑就是&#xff0c;一个rpc调用函数需要返回error&#xff0c;另一个就是crash测试&#xff0c;如果不做临时文件处理&#xff0c;就可能通不过。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
author-avatar
李新绿寧惠_330
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有