资料

  • 视频
  • map-reduce 论文(可下载)
  • 本节的内容

分布式系统

  • 分布式系统即一组计算机协同的提供某种服务,比如大型网站的存储,MapReduce,p2p共享等。
  • 分布式系统的目的是:
    * 通过平行计算提高可用性
    * 通过重复提高容错性
    * 通过计算机的分离提高安全性
    * 与真实情况下计算机之间的分离部署情况匹配(比如配合传感器工作的下位机和上位机)
  • 一致性,可用性,分区容错性,三者是分布式系统经典的话题,三者没有办法同时得到满足(比如,一致性和分区容错性需要依赖通信,在同样的基础上,在传递统一内容时增加额外内容可以增加通信的可靠性,但会使速度下降,减小了可用性)。

Map Reduce(MR)

  • 对大量的数据进行大量的运算时,通常会使用多个计算机进行平行的计算,map reduce 使这个分布式的过程对程序员透明,程序员只需要关心 map reduce 中的特定步骤上执行的内容。
  • 一个简单的 map reduce 流程如下
Abstract view of a MapReduce job -- word count
  Input1 -> Map -> a,1 b,1
  Input2 -> Map ->     b,1
  Input3 -> Map -> a,1     c,1
                    |   |   |
                    |   |   -> Reduce -> c,1
                    |   -----> Reduce -> b,2
                    ---------> Reduce -> a,2
  1) input is (already) split into M files
  2) MR calls Map() for each input file, produces set of k2,v2
     "intermediate" data
     each Map() call is a "task"
  3) when Maps are don,
     MR gathers all intermediate v2's for a given k2,
     and passes each key + values to a Reduce call
  4) final output is set of <k2,v3> pairs from Reduce()s

伪码如下

Word-count-specific code
  Map(k, v)
    split v into words
    for each word w
      emit(w, "1")
  Reduce(k, v_set)
    emit(len(v_set))
  1. MR 将输入切分为 M 个文件
  2. MR 对每个文件调用 map 中的逻辑,产生 M 个形如 <key, value> 的中间结果
  3. Mr 将中间结果中 key 值相同的元组作为一组,传递给 reduce 逻辑
  4. reduce 将输出形如 <key, group_value> 的结果。reduce 输出的结果大多时候也是一组结果。(如果需要输出一个结果,使 map 产生的所有中间结果具有同一个 key 值)

接下来……

map reduce 的大致过程如上,关注一下下面的问题(都可以在论文中找到)

  • map,reduce 间输入和输出的传递如何进行。
  • 在 2004 年,限制 map reduce 处理能里的是网络带宽,主要涉及到对 GFS 的 io。
  • 为了减轻对网络带宽的使用,map 在存有输入文件分片的计算机上进行,其 io 都是在本地硬盘上进行的。这样进行 reduce 的计算机就需要通过 GFS 通过网络,得到 map 计算机本地的文件。
  • 如果一个计算机在处理 map 任务之后崩溃了会怎样,如果是在处理任务时呢,如果是处理 reduce 的计算机呢。

go 教程

推荐 go 的官方教程:

Go 语言之旅