美文网首页
MIT6.824 Lab1

MIT6.824 Lab1

作者: 生若夏花_1ad0 | 来源:发表于2019-02-28 21:33 被阅读0次

    Lab 1. 完成Map和Reduce函数

    lab1我一开始以为很难,实际做下来发现难度尚可,只要一点点做就没有问题。

    这是本门课程的lab1,主要任务是:

    1. 熟悉go语言
    2. 阅读mapreduce论文 下载地址
    3. 完成任务

    首先贴两张别人总结的图


    MapReduce lab1程序执行流程

    Task 1

    1. 首先完成doMap函数
      func doMap(
    
      jobName string, // 输入文件的名字
    
      mapTaskNumber int, // map任务的编号
    
      inFile string,
    
      nReduce int, // 将执行第n个reduce任务 ("R" in the paper)
    
      mapF func(file string, contents string) []KeyValue,//用户自定义的函数
      )
    
    

    doMap完成读取一个输入文件,并使用一个用户定义的函数完成处理,之后分割结果输出为n个reduce的中间文件

    读到这里也没有什么头绪,接着看doMap函数的提示

    map任务产生的多个中间输出文件会存储在磁盘系统中,并且文件的名字显示了是由哪一个map任务产生,并且能够根据名字直到被哪个reduce任务读取。
    提出一个来存储key/value对需要技巧。尤其是要考虑到key和value可能包含新航,引号和其他特殊符号
    一个经常被用来产生序列化数据的字节流模型是JSON,reduce的输出结果是JSON。
    你可以使用下列的代码使得输出的结构作为JSON字符串,响应的解码函数可以在common_reduce.go中找到
    

    通过注释可以总结出doMap的任务如下

    1)根据输入的inFile也即输入文件的名字和内容,调用mapF函数,可以输出keyValue对

    2)对mapF函数的输出调用ihash哈希函数,也就是分类然后再根据nreduce(reduce任务的数量)做一个取余,就可以把结果分为nreduce份

    3)对每一份结果做JSON序列化`

    1. 接着完成doReduce()
      doReduce完成reduce单元的任务,它读取中间的key/value对的值,并根据key的值进行排序,并对每个key调用用户自定义的reduceF函数,最终把结果写道磁盘上

      func doReduce(
      
          jobName string, // 任务的名字
      
          reduceTaskNumber int, // reduce任务的编号
      
          nMap int, // 完成任务的map任务的编号 ("M" in the paper)
      
          reduceF func(key string, values []string) string,//用户自定义
      
      )
      
      

    过程如下

    1)根据reduceName函数找到中间文件的名字,通过Decode()解析json数据

    2)最后把数据写入merge文件中,文件名由mergeName(jobName,reduceaskNumber)得出。

    Task 2

    完成第一部分中用到过的mapF和reduceF函数

    完成一个统计词频的简单功能

    mapF的作用是根据传入的文件名和文件内容,把文件内容分割成key/value对返回

    可以用FieldsFunc()函数做分割,

    reduceF的作用是把传入的value的字符串切片转换为int相加,再转换为string返回,其实就是起了一个统计单词频率的作用

    这一部分很简单,不再赘述

    Task 3

    根据注释,我们直到这一部分是完成schedule()函数,完成map和reduce任务的分发。

    在教程中也说明了为了完成任务,需要阅读master.go worker.go common_rpc.go等文件,另外我发现也要阅读测试文件test_test.go才能够梳理清楚任务执行的流程,方便函数的编写

    在编程过程中需要对go有一个进一步的理解,主要使用到了通道和协程

    同时教程里面建议了用重定向把任务的日志打印到一个文件中方便debug

    在输入命令后通过test_test.go可以总结出任务执行的流程如下:

    1. 创建输入的文本文件

    2. 新建一个master,根据我们要完成的schedule()分配map和reduce任务,在schedule中要注册,然后等待执行任务的单元可以执行任务

    3. 新建二个worker,可以理解为两个执行任务的单元,在接下来的map和reduce过程中是不断的把任务分配给这两个计算单元,同时完成了单元的注册功能,代表master可以进行任务的分配。接着会跟schedule不断进行交互,完成任务

    Task 4

    进行任务中错误过程的处理,也就是如果某个任务没有执行出现了错误,这个时候应该怎么办,解决办法很简单,就是在schedule中加入一个for循环,如果没有执行成功,则再次进行任务的执行

    Task 5

    这个任务是一个可选任务,主要是针对mapF和reduceF处理函数进行更改。在实际应用场景中,对单词出现的频率进行统计并不常见,一个常见的应用时倒排索引,这个任务就是完成倒排索引,关于倒排索引的细节请自行学习。实际上在这个任务中并不是完成一个完成的倒排索引功能,因此只要对task2中完成的函数的编写做细微的改动即可完成这个任务。

    相关文章

      网友评论

          本文标题:MIT6.824 Lab1

          本文链接:https://www.haomeiwen.com/subject/pdkluqtx.html