MIT6.824食用过程

Lab1 MapReduce

一、介绍

本实验使用Go语言构建一个mapreduce库,以及一个容错的分布式系统。第一部分完成一个简单的mapreduce程序,第二部分写一个提交到mapreduce workers 的master 并且要能够处理workers 的错误。 库的接口和容错的方法跟mapreduce paper里面描述的类似。

二、环境搭建 vscode&&go

1. 安装golang

2. 安装git

3.安装cntlm

代理工具,用来给git 和 go 配置代理,下载文件。

git config --global http.proxy http:china\\username:password@proxy:8080

git config --global https.proxy https:china\\username:password@proxy:8080

测试: $ git clone https://github.com/dotcloud/docker.git 如果报错ssl certificate。。。

执行 $ git config --global http.sslVerify false

再执行git clone即可

4. 在vscode 里面下载go插件

三、实验说明

map/reduce实现支持两种操作模式:顺序执行、分布式执行。前者是指一次执行一个task,当所有的map task

执行完才轮到reduce task

程序源码在mapreduce 目录下

通过调用master.go来启动job,可以设置顺序执行和分布式执行

程序执行流程如下:

  • 输入包括:输入文件,map函数,reduce函数,reduce task的数量
  • 启动rpc server(master_rpc.go) 然后等待workers 注册 (master.go -> register)
  • schedule.go -> schedule()决定如何分配任务给workers 以及如何处理失败

3.1 第一部分 编写map/reduce 的输入和输出

$ cd src/mapreduce

$ go test -run Sequential

$ go test -v -run Sequential // debug mode (将common.go里面的debugEnabled改为true)

修改src/mapreduce 下的common_map.go 中的doMap() 函数和 common_reduce.go 中的doReduce() 函数

其中doMap() 函数实现:

  • 读取inputfile,根据reduce task 的个数(nReduce) 生成相应个数的中间文件
  • 命名格式为 mrtmp.[jobName]-[mapTasknum]-[reduceTasknum] 比如 mrtmp.test-0-0

duReduce()函数功能:

  • 读取doMap() 生成的中间文件
  • 并且将nMap个文件进行合并 排序 并且输出
  • 输出文件名为 mrtmp.[jobName]-res-[reduceTasknum] 比如: mrtmp.test-res-0

3.2 第二部分 实现MapFunc 和 ReduceFunc

实现src/main/wc.go 中的MapF() 和 ReduceF()

其中MapF(inputfile string, contents string) 功能:

  • inputfile 是输入的文件名 不用考虑

  • contents 为 inputfile 的内容,调用 strings.FieldsFunc 来完成分词功能

    • 代码如下:

    • words := strings.FieldsFunc(contents, func(c rune) bool {
      return !unicode.IsLetter(c)
      })
      var result = make([]mapreduce.KeyValue, 0)
      for _, w := range words {
      kv := mapreduce.KeyValue{w, "1"}
      result = append(result, kv)
      }
    • 示例

    • func main() {
      f := func(c rune) bool {
      return !unicode.IsLetter(c) && !unicode.IsNumber(c)
      }
      fmt.Printf("Fields are: %q", strings(" foo1;bar2,baz3...", f))
      }

ReduceF(key string, values []string)功能:

  • key 代表每一个键的内容

  • values 是key对应的 values列表

  • 实现:需要统计value的总数

  • count := strconv.Itoa(len(values))
    return count

3.3 分布式mapreduce任务

schedule() 函数通过读取registerChan 来获取workers集合

MIT6.824食用过程的更多相关文章

  1. Mit6.824 Lab1-MapReduce

    前言 Mit6.824 是我在学习一些分布式系统方面的知识的时候偶然看到的,然后就开始尝试跟课.不得不说,国外的课程难度是真的大,一周的时间居然要学一门 Go 语言,然后还要读论文,进而做MapRed ...

  2. MIT-6.824 MapReduce

    概述 MapReduce是由JeffreyDean提出的一种处理大数据的编程模型,用户定义map和reduce函数,map函数处理原始数据生成一系列键值对中间数据,reduce函数并合相同key的键值 ...

  3. 【MIT-6.824】Lab 1: MapReduce

    Lab 1链接:https://pdos.csail.mit.edu/6.824/labs/lab-1.html Part I: Map/Reduce input and output Part I需 ...

  4. MIT-6.824 Raft协议

    摘要 raft是一种比paxos容易理解的一致性算法,实现起来比paxos简单许多.本文前部分描述算法的细节,后部分尝试探讨下该算法的原理. 算法描述 raft算法之所以简单的原因之一是它将问题分解成 ...

  5. MIT-6.824 操作系统 汇总

    MIT-6.828-JOS-环境搭建 ELF文件格式 lab1:C, Assembly, Tools, and Bootstrapping lab2:Memory management lab3:Us ...

  6. MIT6.824 分布式系统实验

    LAB1 mapreduce mapreduce中包含了两个角色,coordinator和worker,其中,前者掌管任务的分发和回收,后者执行任务.mapreduce分为两个阶段,map阶段和red ...

  7. MIT-6.824 Lab 3: Fault-tolerant Key/Value Service

    概述 lab2中实现了raft协议,本lab将在raft之上实现一个可容错的k/v存储服务,第一部分是实现一个不带日志压缩的版本,第二部分是实现日志压缩.时间原因我只完成了第一部分. 设计思路 如上图 ...

  8. MIT 6.824 : Spring 2015 lab1 训练笔记

    源代码参见我的github: https://github.com/YaoZengzeng/MIT-6.824 Part I: Word count MapReduce操作实际上就是将一个输入文件拆分 ...

  9. MIT 6.824 : Spring 2015 lab3 训练笔记

    摘要: 源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab3: Paxos-based Key/Value Service Intro ...

随机推荐

  1. python实用技巧之任务切分

    Python 大任务切分小任务 今天来说说,Python中的任务切分.以爬虫为例,从一个存 url 的 txt 文件中,读取其内容,我们会获取一个 url 列表.我们把这一个 url 列表称为大任务. ...

  2. T-MAX-冲刺总结

    T-MAX-冲刺总结 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 T-MAX 这个作业的目标 冲刺总结 作业的正文 T-MAX-冲刺总结 其他参考文献 面向B站,百度 ...

  3. vue+springboot上传和下载附件功能

    https://blog.csdn.net/qq_35867245/article/details/84325385 上传附件(服务端代码) 第一步:在application.yml中配置附件要上传的 ...

  4. IntelliJ Idea设置默认换行符 Idea

    http://hbyepei.github.io/2016/03/13/设置默认换行符/

  5. Java Web J2EE下的两大框架SSH和SSM对比

    当下流行的两种企业开发MVC开源框架,是我们Java程序猿必备知识能力.MVC,即模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界 ...

  6. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  7. failure during conversion to COFF:file invalid or corrupt

    用Visual Studio 2010编译一个C++工程时突然遇到下面这个编译错误:fatal error LINK1123:failure during conversion to COFF:fil ...

  8. vue模块化以及封装Storage组件实现保存搜索的历史记录

    <template> <div id="app"> <input type="text" v-model='todo' @keyd ...

  9. Oracle insert大量数据经验之谈

    在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验. 前提:在做insert数据之前,如果是非生产环境, ...

  10. phpexcel 导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法

    使用过很多次phpexcel了,有时需要保存文件到磁盘,有时需要浏览器弹出下载.保存到磁盘一半不会出现问题,关键是浏览器弹出保存,经常会发生导出的excel文件无法打开,提示文件格式或文件名无效,文件 ...