MapReduce-深度剖析
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有了些许的改变。
4.总结
本篇博客给大家剖析了MapReduce的计算模型和运行环境,其中计算模型不变,变者乃其运行环境。所变内容,简言之:RM下包含AM和 NM,NM会RM申请Container(其可理解为一个运行时的JVM),NM与RM的通信属于“Pull模型”,即NM主动上报状态信息,RM被动接 受上报信息。
5.结束语
这篇文章就和大家分享到这里,如果大家在研究和学习的过程中有什么疑问,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Hadoop-调优剖析
1.概述 其实,在从事过调优相关的工作后,会发现其实调优是一项较为复杂的工作。而对于Hadoop这样复杂且庞大的系统来说,调优更是一项巨大的工 作,由于Hadoop包含Common、HDFS、MapReduce、YARN等模块,每个模块都有可以根据自身业务进行优化的工作,本篇博客也是针对 某些模块进行调优剖析。 在进行Hadoop调优时,不仅仅只是针对其性能调优,还是涉及到更底层的硬件,OS以及JVM等的优化,如下图所示: 针对以上内容进行优化,均有可能对Hadoop的性能进行提升。 2.OS调优 由于Hadoop的设计决定,其只能用于Linux操作系统作为生产环境。在实际应用场景之中,对Linux参数进行优化,可以在一定程度上提升作业的允许效率。 增大网络连接上限 在Hadoop集群当中,其内部的一些通信依赖网络,需调整Linux参数net.core.somaxconn,让其处于一个足够大的状态。 Swap 在Linux系统当中,如果一个进程的内存不足,其内存中的部分数据会暂时写到磁盘上,在需要的时候,会再将磁盘中的数据动态的置换到内存当 中,这样一来,一些不必要的流程就会显现出来。...
- 下一篇
Hadoop2.x源码-编译剖析
1.概述 最近,有小伙伴涉及到源码编译。然而,在编译期间也是遇到各种坑,在求助于搜索引擎,技术博客,也是难以解决自身所遇到的问题。笔者在被询问多 次的情况下,今天打算为大家来写一篇文章来剖析下编译的细节,以及遇到编译问题后,应该如何去解决这样类似的问题。因为,编译的问题,对于后期业务拓展, 二次开发,编译打包是一个基本需要面临的问题。 2.编译准备 在编译源码之前,我们需要准备编译所需要的基本环境。下面给大家列举本次编译的基础环境,如下所示: 硬件环境 操作系统 CentOS6.6 CPU I7 内存 16G 硬盘 闪存 核数 4核 软件环境 JDK 1.7 Maven 3.2.3 ANT 1.9.6 Protobuf 2.5.0 在准备好这些环境之后,我们需要去将这些环境安装到操作系统当中。步骤如下: 2.1 基础环境安装 关于JDK,Maven,ANT的安装较为简单,这里就不多做赘述了,将其对应的压缩包解压,然后在/etc/profile文件当中添加对应 的路径到PATH中即可。下面笔者给大家介绍安装Protobuf,其安装需要对Protobuf进行编译,故我们需要编译的依赖环境g...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19