MIT6.824分布式系统的正确食用方式(lab1.MapReduce)

hello,我就以做lab1的流程为目录,记录一下我做lab1的时候收获的和容易出错的地方。


1.阅读MapReduce.2004论文,理解map reduce
2.了解go语言,使用git clone源代码
3.阅读源码,了解程序的执行流程
4.按步骤开始做实验


1.阅读MapReduce.2004论文,理解map reduce

关于map reduce,我认为主要关注以下几点。

a.是一种编程框架,将任务分解成多份,交给不同的机器执行

b.MapReduce将任务分为两部分来执行

[map阶段]:处理原始任务,产生包含"中间结果"的键值对的中间文件

[reduce阶段]:处理中间文件,产生包含最后结果的文件

*需要注意的是,这里的map和reduce是用户自定义函数。

c.框架共包含一个master和多个worker master负责给每一个worker分配任务,也负责管理每一个任务的状态。worker负责执行具体的任务,包括map和reduce。

下面这个图就描述的很清楚了。


我就以实验一的word count举个例子来解释一下上面的图(word count就是算出一个长文章中每一个单词出现的次数)。

首先将任务分成5份,接着master将5个任务分别分配给3个worker,每一个执行map的worker会产生2个中间文件(这个2就是源码中nReduce,也就是执行reduce的worker的数量)。map产生的中间文件的内容是,("he","1") ; ("love","1")......这样的键值对,每一个单词都是1。接着reduce处理这些中间文件,将相同的单词的"1"加起来,得到每一个中间文件中每一个单词的个数,并产生一个输出结果文件。后面还会有一个merge函数会统计所有的输出结果文件。

2.了解go语言,使用git clone源代码

go语言还是挺好玩的,看看基本语法就能上手。我是看了这个《An Introduction to Programming in Go》http://www.golang-book.com/books/intro

不过go语言的一些强制特性还是挺讨厌的,比如导入的包必须使用,左括号不能单独占一行,if-else语句的else必须放在if的右大括号处,这些都会报错,调试起来还是很麻烦。

关于git呢,我是看的廖雪峰的git教程。

3.阅读源码,了解程序的执行流程

clone完源代码之后呢,有兴趣了解一下go语言的同学们可以看一看go的工作空间的设置http://www.kancloud.cn/kancloud/web-application-with-golang/44128

介绍流程前,我先说明一下大概的框架。我们要实现的mapreduce框架分为两个版本,一个是sequentia顺序版本,“顺序”说的是一个map任务执行完之后才执行下一个map任务,当所有的map任务执行完之后,才开始按“顺序执行”reduce任务。第二个是distributed版本,这个版本中,map任务是并发执行的,但也是执行完所有的map任务之后才去执行reduce任务。

流程是这样的,从wc.go中的main开始执行,接着执行master.go中的run,然后由run中的schedule来进行调度任务,在schedule中调用了框架的doMap和doReduce,其中又分别调用了用户定义的mapF和reduceF。其中顺序版本是顺序执行,并发版本是通过rpc来并发执行。

4.按步骤开始做实验

part1.

part1需要编写doMap和doReduce这两个函数,这两个函数是框架中的函数,不用考虑具体的事务。我说一下这两个函数的流程。

doMap,首先调用任务文件的内容为参数调用mapF,将结果存取键值对的数组(这里需要读文件,推荐ioutil库)。接着创建nReduce(nReduce在上面图片下面的讲解处)个中间文件,中间文件的名字使用reduceName(common_map.go)来产生。最后把键值对的内容存储到nReduce个文件中,那么有nReduce个文件,怎么知道把某一个key-value对存入到哪一个文件中呢。这里需要用ihash,我使用了如 int(ihash(x.Key))%nReduce 这样的代码,不知道有没有更好的办法。这里也要用到json库,查一查很简单。

doReduce,reduce的事情较多,我列出流程,方便理解。

1.找到属于自己的中间文件(这个可以参照图)

2.读出中间文件的每一个key/value对

3.sort,这里的sort指的是将相同的key/value对存入一个数组中,结果像这样{"he", "1", "1", "1"...}....(从doReduce函数的描述和mapF的参数得到的)

4.对每一个排序过的结果调用redeceF

5.使用mergername函数创建结果文件的名字,创建文件

6.将每个reduceF的结果写入到上一步产生的文件

*这个part是不用写mapF和reduceF的

part2.

这里就要写word count的mapF和reduceF,很简单就不说了。

part3.

前面的版本是顺序版本,这个part要实现并发的版本了,这里的并发是通过多个进程模拟的,不过也是通过rpc实现的,跟真实的情况还是很相近的。具体就不描述了,这里主要是运用这个registerChannel这个channel。注意到当有worker向master注册的时候,会向registerChannel发送消息,我们可以设计当某一个worker执行完之后也向这个registerChannel发送消息,这样程序的框架大概是这样

for{

str := <- mr.registerChannel

//分析str....

}

具体就不描述了,这个实验的乐趣就在这里了。我说一下我调试的方法,在关键点输出"@+信息",然后执行并将程序的输出重定向到文件中,再在文件中搜索"@"。

part4.

能做出前面的话,这里就不成问题了。我这里在加锁解锁方面出了问题,调试了很久。

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

推荐阅读更多精彩内容