剑客
关注科技互联网

MIT 6.824 lab1

花了几天功夫,断断续续做了下 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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址