当前位置: 首页 > news >正文

6.824 lab1

目录

  • 课程内容
  • 基本结构
  • 模块合并
  • RPC 请求
  • 部分思路
  • 结果
  • 解锁大师
  • 感言
  • 晒一下我的 coordinator 的struct

写lab1已经是几个月前了,但是感觉值得写一篇博客,记录一点coding的思路

课程内容

lab1 网址:https://pdos.csail.mit.edu/6.824/labs/lab-mr.html
用git clone下来后,通过测试脚本来确定最后的结果

基本结构

主要完成两个模块coordinator 和 worker 的代码

  1. coordinator:调度器,负责通过RPC请求分配任务、确认任务的完成情况
  2. worker:实际执行器,负责执行mapf和reducef 两类任务

模块合并

对coordinator和worker来说 map任务和reduce任务都极为一致——需要确定当前是否有任务存在、都需要发送心跳确定worker状态、都需要由coordinator来确认任务是否成功。
因此对coordinator和worker来说这两类任务可以抽象成同一个struct,我在里面加了一个 isMap 的参数来区分二者

RPC 请求

Func作用
initWorker从 coordinator处获取 reduce任务的数量(worker在产生中间文件时需要此值)、心跳间隔 等等初始化值
allocateTaskallocate 旨在申请任务,获取成功会返回任务信息,不成功会返回 Wait指令,假如已经全部跑完,会返回 Exit 指令
heartBeat接受worker task 的响应(失败/成功/运行中),相对应更新任务信息,coordinator接收到心跳会重置allocate中的超时定时器

部分思路

  1. coordinator将所有任务id放入chan中,在 allocate中获取任务,获取成功时同步开启一个goroutine执行计时器(超时重新入chan)
  2. 确认map任务全部成功后才能开始reduce任务,最开始是上锁后遍历map status均为running来确认,后面使用 waitGroup,完成一个就wg.Done,最后触发 ctx 的canal,通过 ctx.Done 来确认map任务是否全部完成
  3. worker 先将文件放在tmp类文件内,通过心跳与coordinator达成一致以后才会rename文件为正式版文件名

结果

单次运行时间 1m22s,连续运行100次无报错

解锁大师

考虑到锁该unlock却没有的窘境,我在所有的unlock地方都用了defer,函数内部则用匿名函数来处理(好消息是,随着程序的后续优化,匿名函数都被我处理掉了)

	taskFailed := func() {task.TasksExecResult.T.Lock()defer task.TasksExecResult.T.Unlock()nowStatus, _ := task.TasksExecResult.nolockGet(taskId)if nowStatus == TaskStatusSuccess { // 已经是running, 不用更新logx.Infof("taskId %d is success, dont try again", taskId)return}task.TasksExecResult.nolockSet(taskId, TaskStatusInit, "")task.TasksChan <- taskId // 写回taskId}

感言

  1. 被mutex折腾了好久,经常被锁了但是不知道是哪里,打了非常多的log
  2. early_exit 一直没过,逆向研究了一下 ut 脚本,发现得所有任务都结束以后才能发 Exit 指令,而我是map运行完就给map任务
  3. 我使用心跳一个RPC完成了 同步运行状态、发送成功结果、coodinator确认该结果等多个目标,我觉得这个RPC的作用非常机智
  4. 用了 context.Done 和 canal 来确定是否结束,非常优雅

晒一下我的 coordinator 的struct

// 记录map或者reduce的任务状态
type TaskStatus struct {Ctx      context.Context // 用于快速查看该类型任务是否全部完成T        *sync.MutexStatus   []stringTaskUuid []stringWg       *sync.WaitGroup // 通过wg.Done 和 wg.Wait 确认是否完成, 之后触发canal
}// 对每个小任务的计时器, 用于心跳超时
type TimeoutCon struct {TickerDuration time.DurationTimer          *time.TickerStopChan       chan struct{}
}// map或者reduce任务的所有成员
type Task struct {TasksChan       chan intTasksExecResult *TaskStatusTimeoutCon      []*TimeoutCon
}type Coordinator struct {Context     context.ContextCanal       context.CancelFuncNReduce     int        // reduce 任务的数量MapTaskSize int        // fileNames 分为多少组 - 对应的 taskId: 0~(SplitSize-1)FilesList   [][]string // fileNames 拆分后的内容MapTask    *Task // map taskReduceTask *Task // reduce taskHeartbeatDuration time.DurationExitPolicy string // cooperator 退出时才退出 / 所有任务都完成就退出
}
http://www.xdnf.cn/news/893323.html

相关文章:

  • std::shared_ptr 与 std::unique_ptr 删除器设计差异
  • MATLAB | 绘图复刻(十九)| 轻松拿捏 Nature Communications 绘图
  • C++信号处理程序解析与改进
  • 高通LOG的使用方式
  • 城市客运安全员适合哪些人考?
  • Dagger依赖注入框架的介绍
  • Navicat-16.3.9 windows版本 MySQL客户端可视化工具 中文绿色版 无需补丁,无需破解 解压就能用
  • 江科大独立/窗口看门狗hal库实现
  • 未来教育场景下的家庭教育实训室规划:凯禾瑞华虚拟仿真技术要点前瞻
  • 不等式中的放缩法
  • 零依赖本地调试:VectorDB Lite +VectorDB CLI 高效构建向量数据库全流程
  • ceph pool 修改故障域
  • jdk-8u281-linux-x64.rpm,备用网盘下载,懒得注册官方来看看
  • 临时抱佛脚
  • 安科瑞防逆流方案落地内蒙古中高绿能光伏项目,筑牢北疆绿电安全防线
  • 基于51单片机的超声波智能避障小车仿真
  • AI开启光伏新时代:精准计算每小时发电量​
  • 单精度浮点数值 和 双精度浮点数值
  • 传统业务对接AI-AI编程框架-Rasa的业务应用实战(2)--选定Python环境 安装rasa并初始化工程
  • 高压单端探头设计中的器材应如何选型
  • 嵌入模型、问答模型以及其他常见模型类型的详细解析
  • 云服务器自带的防御可靠吗
  • this.$set() 的用法详解(Vue响应式系统相关)
  • Perforce ALM产品简介:一站式需求与测试管理平台(已通过SO 26262认证)
  • PaddleOCR(3):PaddleOCR命令讲解
  • OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务
  • Win10、Win11系统,使用谷歌浏览器文件流下载,C盘剩余容量小于4GB时,下载失败问题
  • 记一个判决书查询API接口的开发文档
  • 深入解析C++五大常用设计模式:原理、实现与应用场景
  • python变量