悟懂MapReduce,不纠结!

在《谷歌 MapReduce 初探》中,咱们经过统计词频的 WordCount 经典案例,对 Google 推出的 MapReduce 编程模型有了一个认识,可是那种认识,还只是停留在知道有那么个模型存在,并无认识到骨子里。并且上次初探,也遗留了不少猜测和疑问,此次不妨让咱们深刻去认识一下 MapReduce,但愿能达到一个质的认识。面试

重点回顾

MapReduce 主要思想是分治法。采起分而治之的思想,将一个大规模的问题,分红多个小规模的问题,把多个小规模问题解决,而后再合并小规模问题的结果,就可以解决大规模的问题。算法

这么聊下去,我感受会让大家很懵圈!那不妨举点栗子,举栗解千愁。编程

举个不太恰当的栗子,不知道你们有没有在农村掰过玉米,我小时候尚未自动收割机,每当玉米熟了的时候,都是靠人工去掰。要是家庭里只有一个劳动力,那只能一垅一垅的去掰;若是家庭劳动力比较多,就能够分配任务,同时去掰多垅玉米,人手一垅玉米,掰的过程放到篮子里或者地上就行,由于有专门的人手负责打包装车,这样很快一亩地就掰完了,并且能很快统计出掰了几车玉米。数组

人多力量大,不知道你们可否感觉到一丝“分而治之”的理念;多个劳动力人手一行玉米,不知道你们有没有感受到一丝 “MapReduce 之 Map”的概念;专门的人力负责打包装车,不知道你们有没有感受到一丝“Map Reduce 之 Reduce”的概念。ide

再为你假设一个场景,面试的时候给你一个数组:{10,6,7,1,3,9,4,2} 要实现排序。函数

实现方式会有千万种,而咱们只提“归并排序”,由于它是创建在归并操做上的一种有效的排序算法,而且是采用分治法(Divide and Conquer)的一个很是典型的应用。大数据

如上图示意,归并排序的过程已经把分治的思想表达的很清楚了,有对算法感兴趣的能够自行深刻。spa

一图解千愁

为了咱们更清晰的了解 MapReduce 的流程,懒癌犯了,就不画图了,肆意找了一张图贴上。图上字字珠玑,必定要好好揣摩要传达的意思,切记必定要记住整个流程(重点是分区,归并)。blog

重拾案例

经过上面不太恰当的例子和图,稍微对 MapRedcue 的思想抽象了一下,不知道你们有没有什么感触呢?接下来让咱们重拾上次分享提到的“WordCount”的经典案例,窥探一下具体的执行过程。排序

剖析背后。如图示意,主要参与者角色分为 User Program、Master 以及系列 Worker。

User Program 顾名思义就是咱们实现好的业务逻辑处理的 MapReduce 程序代码;

Master 从图中也可以看出来承担了任务分配,可以把任务指派给 map worker 和 reduce worker(应该会存储一些元数据,记录哪些数据要给哪些 map worker,哪些数据要给哪些 reduce worker),猜测应该也会跟踪维护任务的状态;其实也就是皇上,掌控全局。

Worker 从图中可以看出主要分为 Map Worker、Reduce Worker。

Map Worker 从图中也能看出来负责接收用户的输入,而后执行用户实现的 map 操做,结果写入本地中间文件。

Reduce Worker 从图中能够看出来可以读取 Map Worker 产生的中间文件,并执行用户实现的 reduce 操做,并把结果输出(例如写到 GFS 存储)。

如何运转?这里要提一本书《大数据技术原理与应用》,由于下面这段剖析来自于这本书。

(1)执行 WordCount 的用户程序(采用 MapReduce 编写),会被系统分发部署到集群中的多台机器上,其中一台机器做为 Master,负责协调调度做业的执行,其他机器做为 Worker,能够执行 Map 或 Reduce 任务。

(2)系统分配一部分 Worker 执行 Map 任务,一部分 Worker 执行 Reduce 任务;MapReduce 将输入文件切分红 M 个分片,Master 将 M 个分片分给处于空闲状态的 N 个 Worker 来处理。

(3)执行 Map 任务的 Worker 读取输入文件,执行 Map 操做,生成一系列 <key,value> 形式的中间结果,并将中间结果保存在内存的缓冲区中。

(4)缓冲区中的中间结果会被按期刷写到本地磁盘上,并被划分为 R 个分区,这 R 个分区会被分发给 R 个执行 Reduce 任务的 Worker 进行处理;Master 会记录这 R 个分区在磁盘上的存储位置,并通知 R 个执行 Reduce 任务的 Worker 来“领取”属于本身处理的那些分区的数据。

(5)执行 Reduce 任务的 Worker 收到 Master 的通知后,就到相应的 Map 机器上“领回”属于本身处理的分区。不过可能会从多个 Map 机器上领取数据,所以当全部 Map 机器上的属于本身处理的数据都已经领取回来之后,这个 Reduce 任务的 Worker 会对领取的键值对进行排序(若是内存中放不下须要用到外部排序),使得具备相同 Key 的键值对汇集在一块儿,而后就能够开始执行具体的 Reduce 操做了。

(6)执行 Reduce 任务的 Worker 遍历中间数据,对每个惟一 key 进行 Reduce 函数,结果写入到输出文件中;执行完毕后,唤醒用户程序,返回结果。

可靠性保证?

Master 的可用性?认为 Master 挂掉概率很小,若是挂掉任务就执行失败。

Worker 的可用性?Master 每隔一段时间会 ping 每一个 Worker,若是 Worker 长时间没回复,Master 就将它标记为失效。若是失效的的 Worker 执行的是 Map 任务,则须要通知对应的 reduce 的 Worker 节点去新的 Map Worker 节点拿输入数据。

答疑解惑

针对上期遗留的问题逐个进行剖析解答。

猜测:map、reduce 函数中间感受又触发了“针对同一个单词的 value 的组合(也就是把相同单词出现的次数,串在一块儿)”,否则 reduce 函数怎么能接收到 values(每一个单词对应的出现次数的一串“1”)。

这不就是归并的事情么!在“一图解千愁”以及“如何运转?”环节中均有答案!

疑问 1:map 产生的中间键值对,是放到内存、本地磁盘仍是放到了 GFS 上存储?

在“一图解千愁”以及“如何运转?”环节中均有答案!

疑问 2:咱们写好了 Map 函数和 Reduce 函数,怎么就跑到了多台机器上呢?

在“如何运转?”环节中已经有答案!

好了,这篇分享都到这儿吧,但愿大家可以喜欢,若是感受有点帮助,那就动动手指转发分享一下吧。

相关文章
相关标签/搜索