MIT6.824 Lab1

Lab 1. 完成Map和Reduce函数

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

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

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

首先贴两张别人总结的图


MapReduce
MIT6.824 Lab1_第1张图片
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)