MIT6.824 Lab1

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中完成的函数的编写做细微的改动即可完成这个任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351