深入浅出分布式【MapReduce】 (MIT 6.824)

概述

大名鼎鼎的MapReduce,作为MIT 6.824课程的入门级材料,实在是给了不少人学下去的动力(比如我自己…)。

什么是MapReduce?简而言之,它是一种计算模型。这种计算模型将一个任务的计算分为了Map和Reduce两个阶段(好像什么都没讲…),每个阶段都有若干个Worker执行相同的Map或者Reduce函数,而这两个函数都是用户自己定义的。其中,Map函数的输入值为一对Key/Value Pair,并输出一个过渡状态下(intermediate)的Key/Value Pair的集合。MapReduce库会自动将那些具有相同的intermediate Key的Value再次组合在一起。而Reduce函数的输入就是这个intermediate Key及其对应的Value列表,大多数情况下,用户定义的Reduce函数会将列表中的这些Value再次处理下(比如统计个数、最值等),并返回处理后的值。

这样说可能还是有点抽象。我们以最经典的Word Count为例,该任务是要统计给定的一些文章中每个Word出现的次数。在MapReduce模型下,用户所需提供的Map函数大致会是这样

map (String key, String value):
// key: Document name
// value: Document contents
  for each word w in value:
    EmitIntermediate(w, 1)

reduce (String key, List values):
// key: a word
// values: a list of 1
  Emit(len(values))

其运行流程如下:

  1. 若干个Worker被分配了Map任务,不同的Key保证了每个Worker读取的文件并不一样。Map任务中,针对一片文章(Value)的每个词w,该函数都会输出一个过渡状态的键/值对{w: 1};
  2. 在全部Worker的Map任务都结束后,MapReduce库通过某种神奇的手段将每个过渡态的Key w所对应的Value都组合在了一起。这样,假设foo这个词在全部输入文档中出现了n次,我们就会得到一个{‘foo’:[ 1,1,,1 ]}的过渡态Key/List Pair。其中[ 1,1,,1] 的长度为n;
  3. 随后,若干个Worker又会被分配了Reduce任务。Reduce函数的输入便是步骤2里的Key/List Pair。此例中我们关心的只是一个词出现的次数,也即List的长度,因此Map中输出的键/值对中具体是什么值其实并没有很大影响(1可以替换为其他任何值)。Reduce函数会输出它针对该Key所得到的最终的计算结果。
  4. 最后,MapReduce库再将每个过渡Key及其对应的Reduce结果整合在一个文件中并返回给用户。

说了用户使用的方法,然而作为分布式系统设计的学习者,我们显然不会仅局限在使用的层面上。那么MapReduce究竟是如何实现的呢?我个人认为,理解了下面这张图,MapReduce的基本原理也就差不多了。

我们可以看到,这是一个非常典型的Master-Worker结构(这种结构我们在之后还会经常遇到):一台Master服务器充当决策者,给各个空闲的Worker分配任务,并实时监控它们的状态。

鉴于Jeff Dean的这篇文章实在太经典,且网上大牛们写的MapReduce的资料实在太充足,在这里我只想简单的翻译下原文关于MapReduce流程的叙述,以免班门弄斧…

  1. MapReduce库首先会将输入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值