开发者社区> smartloli> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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.结束语

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
⭐️ C语言进阶 ⭐️数据在内存中的存储(深度剖析)(二)
本文主要讲解点 数据类型详细介绍 整形在内存中的存储:原码、反码、补码 大小端字节序介绍及判断 浮点型在内存中的存储解析
41 0
(深度剖析数据在内存中的存储) C语言从入门到入土(进阶篇)(二)
1. 数据类型介绍 1.1 类型的基本归类 2. 整形在内存中的存储 2.1 原码、反码、补码 这里同时补充一下源码求补码的两种方法: 2.2 大小端介绍 2.3 练习 (每题都能让你意想不到) 3. 浮点型在内存中的存储 3.1 一个例子 3.2 浮点数存储规则 3.3对浮点数存储的补充
23 0
(深度剖析数据在内存中的存储) C语言从入门到入土(进阶篇)(三)
1. 数据类型介绍 1.1 类型的基本归类 2. 整形在内存中的存储 2.1 原码、反码、补码 这里同时补充一下源码求补码的两种方法: 2.2 大小端介绍 2.3 练习 (每题都能让你意想不到) 3. 浮点型在内存中的存储 3.1 一个例子 3.2 浮点数存储规则 3.3对浮点数存储的补充
30 0
E-MapReduce弹性低成本离线大数据分析
基于阿里云的E-MapReduce(EMR) 、对象存储OSS、日志服务SLS、抢占式ECS实例构建弹性、低成本的计算与存储分离架构的海量离线大数据分析日志分析系统。
765 0
E-MapReduce 4.0产品新特性
E-MapReduce是运行在阿里云平台上的一大数据处理的系统解决方案。在2019年10月,阿里巴巴将发布EMR4.0版本。本篇介绍EMR4.0的新特性,包括在EMR基础能力,技术栈,生态集成和数据迁移等方面的升级,EMR4.0为用户提供更高的计算性能和更低的产品价格,将技术的红利让给用户。
5810 0
E-MapReduce 2.0.0 版本发布
本次发布包括: 修改了界面的版本选择,新增了2.0.0版本,隐去了1.x版本(用SDK仍然可以继续创建,但我们强烈建议升级到最新版本),合并了Hadoop和HBase的版本选择。 Hadoop版本进行了升级,2.6.0 -> 2.7.2 集群JDK版本升级,1.7.0 -> 1.8.0 新增
3424 0
Mapeduce编程八大步骤
Mapreduce编程八大步 1.1:指定读取的文件位于哪里 FileInputFormat.setInputPaths() 指定如何对输入文件进行格式化,把输入文本每一行解析为键值对 job.
741 0
+关注
smartloli
笔名:哥不是小萝莉 博客园地址:http://www.cnblogs.com/smartloli/
162
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载