1.概述

  在接触了第一代MapReduce和第二代MapReduce之后,或许会有这样的疑惑,我们从一些书籍和博客当中获取MapReduce的一些原理和算法,在第一代当中会有JobTrack,TaskTrack之类的术语,在第二代会有ResourceManager,NodeManager,ApplicationMaster等等术语。然又有Shuffle、Partitioner、Sort、Combiner等关键字,如何区分它们,理顺其之间的联系。

  在Hadoop2.x大行其道的年代,其优秀的资源管理框架(系统),高可用的分布式存储系统,备受企业青睐。然因上述之惑,往往不能尽得其中之深意。此篇博客笔者为大家一一解惑。

2.计算模型

  在阅读和研究第一代MapReduce和第二代MapReduce之后,我们可以发现MapReduce其实由两部分组成,一者为其计算模型,二者为其运行环境。到这里,就不难解释为何在第一代MapReduce里面由Shuffle、Sort等内容,而在第二代MapReduce中也同样存在其相关内容。原因很简单,在Hadoop2.x中,MapReduce的变化,只有其运行环境变化了,然其计算模型依旧不变。

  在MapReduce的计算模型当中,对方法进行了高阶抽象,其精华为Map Task和Reduce Task,在Map阶段完成对应的map函数的逻辑实现,与之相对的在Reduce阶段完成对应的reduce函数的逻辑实现,即可编写好整个核心的MapReduce的处理过程,在Main函数入口之处,申请对应的Job,指定相应的Mapper和Reducer继承类,以及其输入输出类型等相关信息,即可运行一个完整的MapReduce任务。

  虽说我们能够编写一个完成MapReduce程序,并运行它。然其运行的细节,我们却未必清楚,往往初学者在编写一个MapReduce作业时,遇到错误而不去研究分析其错误之根本,转而求助于搜索引擎,在搜索无望之下,会让自己瞬间懵逼,不知所措。

  这里,我们去剖析其计算模型的执行细节,虽不敢说剖析之后能解决所有的疑难杂症,但起码能让我们知晓错误原因,能够找到解决问题的方向,继而解决我们所遇之难题。下面为大家剖析MapReduce的计算模型。

  Map阶段,简言之:

  • Read:该步骤是去读取我们的数据源,将数据进行filter成一个个的K/V
  • Map:在map函数中,处理解析的K/V,并产生新的K/V
  • Collect:输出结果,存于环形内缓冲区
  • Spill:内存区满,数据写到本地磁盘,并生产临时文件
  • Combine:合并临时文件,确保生产一个数据文件

  Reduce阶段,简言之:

  • Shuffle:Copy阶段,Reduce Task到各个Map Task远程复制一分数据,针对某一份数据,若其大小超过一定阀值,则写磁盘;否则放到内存
  • Merge:合并内存和磁盘上的文件,防止内存占用过多或磁盘文件过多
  • Sort:Map Task阶段进行局部排序,Reduce Task阶段进行一次归并排序
  • Reduce:将数据给reduce函数
  • Write:reduce函数将其计算的结果写到HDFS上

  上述为其计算模型的执行过程,需有几点要额外注意。这里有些阶段,我们在编写相关应用时,需有谨慎。

  这里有一个Combine阶段,这个阶段的使用有助与我们对MapReduce的性能进行优化,为何这么说?细细剖析该过程便可明白。在map函数时,它只管处理数据,并不负责统计处理数据的结果,也就是说并没有Combine阶段,那么,问题来了,在reduce过程当中,因为每个map函数处理后的数据没有统计,它除了要统计所有map的汇总数量,还要统计单个map下的处理数。也许,这里有点绕,大家可以参照下图来理解这层意思,如下图所示:

  然而,这样是不行的,所以Reduce为了减轻压力,每个map都必须统计自己旗下任务处理结果,即:Combine。这样,Reduce所做的事情就是统计每个map统计之后的结果,这样子就会轻松许多。因而,Combine在map所做的事情,减轻了Reduce的事情,省略了上图中的步骤1。

  具体代码细节,可在Job的属性方法中设置对应的参数,如下所示:

job.setCombinerClass(DefReducer.class);

  另外,我们也有必要理解Partition相关职责,它是分割map节点的结果,按照Key分别映射给不同的Reduce,这里我们可以理解为归类,对一些复杂的数据进行归类。在Job属性中设置对应的分区类,那么你的分区函数就生效了,如下所示:

job.setPartitionerClass(DefPartition.class);

3.运行环境

  在Hadoop2.x中,由于有了YARN来做资源管理,因而第二代MapReduce的运行环境,对比第一代MapReduce有了些许的改变。具体改变细节,可参考我写的另一篇博客:《MapReduce运行环境剖析》。

4.总结

  本篇博客给大家剖析了MapReduce的计算模型和运行环境,其中计算模型不变,变者乃其运行环境。所变内容,简言之:RM下包含AM和NM,NM会RM申请Container(其可理解为一个运行时的JVM),NM与RM的通信属于“Pull模型”,即NM主动上报状态信息,RM被动接受上报信息。

5.结束语

  这篇文章就和大家分享到这里,如果大家在研究和学习的过程中有什么疑问,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

MapReduce-深度剖析相关推荐

  1. 宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析

    宽依赖和窄依赖深度剖析.png RDD依赖关系与stage划分 Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系. 1. ...

  2. libevent源码深度剖析

    原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 --序幕 张亮 1 前言 Libevent是一 ...

  3. libevent源码深度剖析十一

    libevent源码深度剖析十一 --时间管理 张亮 为了支持定时器,Libevent必须和系统时间打交道,这一部分的内容也比较简单,主要涉及到时间的加减辅助函数.时间缓存.时间校正和定时器堆的时间值 ...

  4. 《AngularJS深度剖析与最佳实践》一第1章 从实战开始

    本节书摘来自华章出版社<AngularJS深度剖析与最佳实践>一书中的第1章,作者 雪狼 破狼 彭洪伟,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第1章 从 ...

  5. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

  6. [Android] Toast问题深度剖析(二)

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...

  7. Mysql binlog应用场景与原理深度剖析

    1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...

  8. SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践

    SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践 前言:自从上一篇文章发出之后,收到了很朋友的关注.很多朋友要求多多实践,而不是纯粹的理论.确实,从打算出这个系列开始,我就本 ...

  9. 嵌入式网络那些事LwIP协议深度剖析与实战演练pdf

    下载地址:网盘下载 <嵌入式网络那些事:LwIP协议深度剖析与实战演练>面向网络TCP/IP协议初学者以及大量嵌入式网络开发人员,从当下流行的嵌入式网络协议栈LwIP的源代码入手,详细讲解 ...

  10. 深度剖析Zabbix Web scenarios数据表结构

    深度剖析Zabbix Web scenarios数据表结构 前言 因开发需求,需要解析Zabbix web监控数据表结构:因为网上关于Zabbix数据表结构解析的比较少,所以心血来潮写了一篇作为记录. ...

最新文章

  1. 提高云计算中的软件质量
  2. Java黑皮书课后题第9章:9.7(Account类)设计一个名为Account的类,它包含……。编写一个测试程序,创建一个账户ID为1122、余额为20000美元、年利率为4.5%的Account…
  3. ASP.NET Core 2.0利用MassTransit集成RabbitMQ
  4. JavaScript 删除某个数组中指定的对象
  5. php文本框长度限制,php截取富文本框中的固定长度的字符
  6. SysUtils.AdjustLineBreaks - Unix 与 Windows 的换行符互换
  7. 黄河水利职业技术学院焦作大学计算机谁好,注意丨你可能上了个假大学!填报志愿需谨慎,全国381所“野鸡大学”曝光,河南6所...
  8. abap 日期格式转换
  9. 自家主机建云服务器_用云主机还是自己建服务器好
  10. 19春学期《计算机应用基础》123,[东北大学]20春学期《计算机应用基础》在线平时作业123(参考答案)...
  11. Qt 绘制炫彩滚动文本
  12. 深入理解LEFT JOIN
  13. lisp和python_给Lisp程序员的Python简介
  14. python读取股票数据_如何利用程序(如python) 从新浪财经或者雅虎财经获取到所有A股数据(历史日线数据,实时股票数据)?...
  15. 概率导论--一--样本空间与概率
  16. 一个简单的纸牌小游戏
  17. 米家扫拖一体机器人重置键_米家扫拖一体机器人的使用感受和小建议
  18. 药店app的布局html,APP界面常用的8种页面布局
  19. 资源共享,免费下载源码网站,很实惠!
  20. 【新】Python获取前N周时间开始日期和截止日期

热门文章

  1. JAVA的日期与毫秒的相互转换
  2. 20220307:力扣第283场周赛(上)
  3. linux程序流量平滑,Linux下按程序查实时流量 network traffic(示例代码)
  4. MS DOS窗口进入JAVA源程序,从java程序运行MS-DOS命令
  5. 计数 APP android,SharedPreferences初学~个人备忘录以及对进入APP的次数进行计数
  6. k8s创建pod加入容器_K8S容器编排之POD健康检测(2)
  7. github访问慢解决办法
  8. Enjoy模板里使用layui模板引擎laytpl
  9. 让英文版的LINUX 支持中文显示
  10. Centos7安装Docker(二进制)