MIT 6.824 lab1
2016年9月27日
前言
花了几天功夫,断断续续做了下lab1
。其实大部分时间都在看Go
。非常非常简洁的一门语言。对并发的支持非常好。值得花时间学习。然而MapReduce
并没想象的这么复杂。
MapReduce
主要思想很简单。主要由map
和reduce
两个函数组成。(玩过函数式编程的朋友,对这两个函数应该很熟悉),数据从map
输入,输出一系列键值对,再由reduce
把输出的键值对根据键组合在一起。当然最有趣的地方是,这些操作都是异步的,在多个机器上运行,所以非常快。
实现步骤
- 把数据分成
M
份,分别是Mi
- 启动一个
master
对象,由它来控制如何分配调控 master
不断的挑出一个好的机器(worker
)来对Mi
进行执行map
函数map
函数返回一个key/value
数组- 然后把
key/value
数组分成R
份存在本地,等待Reduce
。当map
全部完成后,每个Mi
生R
份结果。 - 从每个
Mi
中选择一份Ri
。然后根据Key
排序,把相同Key
的Value
合在一起,生成key/list(value)
- 开始
reduce
,输入list(value)
。 - 最后会生成
R
份文件
最后的R
份文件没必要直接合在一起。通常会把它们丢给下个MapReduce
lab
总体来说不难。实现步骤全在paper
中讲的很清楚了
lab1
完成两个函数doMap
和doReduce
。doMap
就是完成上面4,5
两个步骤.doReduce
是上
面7,8
两个步骤。注意这里不是异步,而是顺序执行lab2
实现wordcount
,只要完成了lab1
,lab2
就是手到擒来的事情。lab3
略复杂一点。把上面map
和reduce
的操作变成异步。Go
中有一个很有趣的东西,叫做channel
可以起到很大帮助。类似于生产者消费者。这里不细讲。另外还需要一点RPC
的知识。lab4
处理worker
失败的情况。如果失败就让别的worker
重新执行这个任务。
具体代码放在mit-6.824