在《谷歌 MapReduce 初探》中,我们通过统计词频的 WordCount 经典案例,对 Google 推出的 MapReduce 编程模型有了一个认识,但是那种认识,还只是停留在知道有那么个模型存在,并没有认识到骨子里。而且上次初探,也遗留了很多猜想和疑问,这次不妨让我们深入去认识一下 MapReduce,希望能达到一个质的认识。

重点回顾

MapReduce 主要思想是分治法。采取分而治之的思想,将一个大规模的问题,分成多个小规模的问题,把多个小规模问题解决,然后再合并小规模问题的结果,就能够解决大规模的问题。

这么聊下去,我感觉会让你们很懵圈!那不妨举点栗子,举栗解千愁。

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

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

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

实现方式会有千万种,而我们只提“归并排序”,因为它是建立在归并操作上的一种有效的排序算法,并且是采用分治法(Divide and Conquer)的一个非常典型的应用。

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

一图解千愁

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

重拾案例

通过上面不太恰当的例子和图,稍微对 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 函数,怎么就跑到了多台机器上呢?

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

好了,这篇分享都到这儿吧,希望你们能够喜欢,如果感觉有点帮助,那就动动手指转发分享一下吧。

悟懂MapReduce,不纠结!的更多相关文章

  1. 一文读懂MapReduce

    Hadoop解决大规模数据分布式计算的方案是MapReduce.MapReduce既是一个编程模型,又是一个计算框架.也就是说,开发人员必须基于MapReduce编程模型进行编程开发,然后将程序通过M ...

  2. 搞懂MapReduce

    MapReduce的主要思想就是将计算任务分发至多台计算机(slave),然后master综合计算机结果.所以就涉及到多台计算机通信和同步的问题,这个应该由hadoop完成,把环境配置好后就像单机操作 ...

  3. 一文读懂MapReduce 附流量解析实例

    1.MapReduce是什么 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式 ...

  4. 聊起 BigTable,让你不再胆怯

    谷歌“三驾马车”的出现,才真正把我们带入了大数据时代,并指明了大数据的发展方向. GFS 作为其中一驾宝车,解决了大数据存储的难题.它能够把大量廉价的普通机器,聚在一起,充分让每台廉价的机器发挥光和热 ...

  5. 《转载》化繁为简 如何向老婆解释MapReduce?

    本文转载自http://server.zol.com.cn/329/3295529.html 昨天,我在Xebia印度办公室发表了一个关于MapReduce的演说.演说进行得很顺利,听众们都能够理解M ...

  6. 化繁为简 如何向老婆解释MapReduce?(转载)

    化繁为简 如何向老婆解释MapReduce? 昨天,我在Xebia印度办公室发表了一个关于MapReduce的演说.演说进行得很顺利,听众们都能够理解MapReduce的概念(根据他们的反馈).我成功 ...

  7. 关于MapReduce

    MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算.概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量 ...

  8. MapReduce概念(转)

    昨天,我在Xebia印度办公室发表了一个关于MapReduce的演说.演说进行得很顺利,听众们都能够理解MapReduce的概念(根据他们的反馈).我成功地向技术听众们(主要是Java程序员,一些Fl ...

  9. Hadoop 4、Hadoop MapReduce的工作原理

    一.MapReduce的概念 MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框就是mapreduce,两者缺一不可,也就是 ...

随机推荐

  1. 「从零单排HBase 06」你必须知道的HBase最佳实践

    前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...

  2. node打开本地应用程序

    1.打开浏览器 最简单的方法: const cp = require('child_process') cp.exec('start http://127.0.0.1:8889/'); // 自动打开 ...

  3. 网络工程师和Linux运维工程师有什么区别?学哪个比较好?

    网络工程师和Linux运维工程师有什么区别?学哪个比较好? 机缘巧合下,我进入了一家从事vpn与系统集成的公司,很感谢公司能留下我这个非网络工程专业的毕业生,从对网络一窍不通,慢慢可以自己独立完成工作 ...

  4. Win10下如何安装和搭建appium自动化测试环境

    转:https://www.cnblogs.com/huainanhai/p/11577419.html 安装Android SDK https://www.jianshu.com/p/2acdc1d ...

  5. 网络编程---socket模块

    内容中代码都是先写  server端, 再写 client端 1 TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效 ...

  6. 「CSS」常见的清除浮动方法

    下面介绍几种清除浮动的方案,供大家参考: 使用额外的标签clear:both .parent {padding: 10px;width: 200px;background: red;} .child ...

  7. 网络安全从入门到精通(第一章-2)快速自建web安全测试环境

    本文内容 动态语言 常见服务器脚本 动态语言可以做什么? 常见服务器环境快捷搭建软件 快速的搭网站的环境 CMS 1,动态语言:是对服务器行为的编程,这被称为服务器端脚本或服务器脚本. 2,常见服务器 ...

  8. 曹工说Spring Boot源码(24)-- Spring注解扫描的瑞士军刀,asm技术实战(上)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  9. 记一次phpstudy应急响应

    某日,销售接了一个电话,突然告诉我有个某单位服务器中了木马被黑,具体情况未知.由于客户那边比较急,于是我火速赶往客户现场.到现场,客户首先给我看了深信服防火墙拦截记录,显示内网三台机器被入侵.通过沟通 ...

  10. 优秀DevOps工程师必会的33个面试题

    DevOps面试问题 01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗? 答:尽管DevOps与敏捷方法(这是最流行的SDLC[Software Development Life C ...