MIT 6.824 lab1

花了几天功夫,断断续续做了下 lab1 。其实大部分时间都在看 Go 。非常非常简洁的一门语言。对并发的支持非常好。值得花时间学

花了几天功夫,断断续续做了下 lab1

。其实大部分时间都在看 Go

。非常非常简洁的一门语言。对并发的支持非常好。值得花时间学习。然而 MapReduce

并没想象的这么复杂。

MapReduce

主要思想很简单。主要由 map

reduce

两个函数组成。(玩过函数式编程的朋友,对这两个函数应该很熟悉),数据从 map

输入,输出一系列键值对,再由 reduce

把输出的键值对根据键组合在一起。当然最有趣的地方是,这些操作都是异步的,在多个机器上运行,所以非常快。

实现步骤

  1. 把数据分成 M

    份,分别是 Mi

  2. 启动一个 master

    对象,由它来控制如何分配调控

  3. master

    不断的挑出一个好的机器( worker

    )来对 Mi

    进行执行 map

    函数

  4. map

    函数返回一个 key/value

    数组

  5. 然后把 key/value

    数组分成 R

    份存在本地,等待 Reduce

    。当 map

    全部完成后,每个 Mi

    R

    份结果。

  6. 从每个 Mi

    中选择一份 Ri

    。然后根据 Key

    排序,把相同 Key

    Value

    合在一起,生成 key/list(value)

  7. 开始 reduce

    ,输入 list(value)

  8. 最后会生成 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

未登录用户
全部评论0
到底啦