在《谷歌 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. 快速排序python实现总结

    背景:数据结构与算法是IT相关的工程师一直以来的基础考察重点,很多经典书籍都是用c++或者java来实现,出于对python编码效率的喜爱,于是取search了一下python的快排实现,发现大家写的 ...

  2. 记录:更新VS2019后单元测试运行卡住无法运行测试的问题。

    先说一下是如何遇到这个问题的 今天更新了Visual Studio到最新的版本,然后在运行之前建立的单元测试项目的时候一直卡住,过了一会儿以后提示 未能协商协议,等待响应在 90 秒后超时.出现此问题 ...

  3. layui表格数据渲染SpringBoot+Thymeleaf返回的数据时报错(Caused by: org.attoparser.ParseException: Could not parse as expression: ")

    layui table渲染数据时报错(Caused by: org.attoparser.ParseException: Could not parse as expression: ") ...

  4. wpf 菜单样式和绑定树形数据

    前言 在wpf开发中,经常会使用到Menu和ContentMenu.但是原生的样式比较简陋,对于比较追求界面美好的人来说是十分不友好的.那么,这就涉及到对Menu的样式修改了.与此同时,我们还希望Me ...

  5. 在Windows中像Linux里一样使用CMake和make

    1. 安装GCC环境 1.1 安装MinGW(Minimalist GNU for Windows) 首先下载MinGW,并安装.安装完成之后运行MinGW Installer.界面如下.勾选自己需要 ...

  6. 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并

    [练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...

  7. 给 ABP vNext 应用安装私信模块

    在上一节五分钟完成 ABP vNext 通讯录 App 开发 中,我们用完成了通讯录 App 的基础开发. 这本章节,我们会给通讯录 App 安装私信模块,使不同用户能够通过相互发送消息,并接收新私信 ...

  8. Integration of Metabolomics and Transcriptomics To Reveal Metabolic Characteristics and Key Targets Associated with Cisplatin Resistance in Nonsmall Cell Lung Cancer(解读人:林山云)

    期刊名:J. Proteome Res 发表时间:(2019年8月) IF:3.78 单位: 上海第九人民医院药学系,上海交通大学药学院 上海交通大学药物与生物化学系   物种:人源A549细胞系 技 ...

  9. 批量redis未授权检测工具&批量redis弱口令爆破工具

    今天需要然后就百度搜索了一波,然后自己稍微改了一下: #!/usr/bin/python3 # -*- coding: utf-8 -*- """ @Author: 偷来 ...

  10. SpringCloud系列之服务注册发现(Eureka)应用篇

    @ 目录 前言 项目版本 Eureka服务端 Eureka客户端 服务访问 前言 大家好,距离上周发布的配置中心基础使用已过去差不多一周啦,趁着周末继续完善后续SpringCloud组件的集成,本次代 ...