Hadoop和Spark的前世今生 & MR、Yarn、Spark架构原理

目录

架构原理总图

一、Hadoop的历史

->   1.0版本

       ->   缺点

 ->   2.0版本

->   MapReduce架构组成:

->   Yarn架构组成和运行原理:

二、Spark的历史

->   Spark架构组成

->   Driver和Executor


架构原理总图

一、Hadoop的历史

->   1.0版本

·   2003年、2004年,google的两篇论文奠定了hadoop的基础思想;

    Hadoop起源以及Google三篇论文介绍(三篇论文其中一篇讲分布式文件系统,诞生了HDFS,另一篇讲分布式计算模型,诞生了MapReduce,最后一篇是BigTable)

·   2006年Apache基金会将Hadoop作为一个项目开始研发;

·   2011年Hadoop1.0版本发布,由分布式存储系统HDFSNameNode、DateNode)和分布式计算框架MapReduceJobTracker、TaskTracker)组成;

·   2012年3月,Hadoop稳定版发布

->   缺点

(1)NameNode是单点操作,容易出现单点故障,不支持高可用HA,制约了HDFS的发展,因为一旦单点的NameNode不可用导致整个HDFS直接不可用;

(2)NameNode的内存限制影响了HDFS的发展;

(3)MapReduce的初衷是进行单一数据计算,仅有一个Mapper-Reduce过程,拿到数据后打散,然后计算后再聚合;如果reducer的结果需要继续进行MR操作,不支持;如果迭代计算就需要再一次进行Mapper-Reduce过程;

         Mapper从HDFS获取数据IO一次,Mapper到Reducer中间Shuffle会IO一次,Reducer数据存储到HDFS又IO一次,也就是说进行一次Mapper-Reduce需要IO三次,性能非常慢,所以1.0版本Hadoop一般只进行单一数据计算,而不支持迭代计算。

                              

(4)MR框架中资源调度存在很大的问题,JobTracker也是单点不支持HA,它同时做资源调度和任务调度,任务量非常大;这样在MR框架中资源调度和任务调度耦合在一起,无法扩展。

                                   

->   2.0版本

由于Hadoop1.X版本存在HDFS单点式NameNodeMapReduce的双重缺陷,发布了新的版本来改善这种情况

·   2013年10月,Hadoop2.X版本发布,版本最大的变化是加入了Yarn(ResourceManager、NodeManager)

(1)首先2.X通过zookeeper实现了NameNode的高可用,1.X版本只有一个NameNode,2.X版本可以支持多个NameNode了;

(2)然后2.X版本支持Yarn资源调度框架,只做资源调度,不做任务调度;

(3)2.X版本中MR框架只做任务调度,这样1.X版本MR又做资源调度又做任务调度的耦合性就解决了;

(4)2.X版本中,MR可插拔,所以扩展性非常强。

ps:因为资源调度被Yarn管理,所以Hadoop生态中可以不使用MR框架进行任务调度,实现了计算框架的可插拔性,像现在引入Spark到Hadoop中作为任务计算框架就是得益于此。

->   MapReduce架构组成:

(1)MRAppMaster:负责整个程序的过程调度和状态协调,即任务调度;

(2)Map Task:负责Map阶段的整个数据处理流程;

(3)Reduce Task:负责Reduce阶段的整个数据处理流程。

->   Yarn架构组成和运行原理:

(1)ResourceManager(RM),这个实体控制整个集群并管理应用程序向基础计算资源的分配,承担了1.X版本Job Tracker的角色;

         处理客户端请求,启动和监控ApplicationMaster,监控NodeManager,资源的分配与调度

(2) ApplicationMaster(AM),负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配),承担了1.X版本Task Tracker的部分角色;

         负责数据的切分,为应用程序申请资源并分配给内部的任务,任务的监控与容错

(3)NodeManager(NM),管理Yarn集群中每个节点的资源,处理来自RM和AM的命令;

(4)Container,容器,它封装了某个节点上的多维度资源,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的;YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

ps:由于NodeManager是资源框架,Container中是计算框架,所以两者分开避免了耦合性,实现了计算框架的可插拔性,在NodeManager资源框架环境下,Container中的计算框架可以是MR也可以是Spark等

ps:RM控制整个集群的资源分配与调度,

       AM为任务向RM申请资源,RM返回的资源以Container封装表示,

       AM再将Container分配给NM,

       NM对Container中资源的使用和执行进行监控和管理,

       具体的计算框架在Container中实现,调用Container的资源环境。

绿色部分是Yarn,表示资源调度,

Container里紫色部分表示资源环境白色部分是任务调度,由MR框架组成

任务调度由MRAppMaster实现,MR Task与其共同构成计算框架;

由于资源调度与任务调度耦合性解除,Container的计算框架也可以用Spark等,实现了计算框架的可插拔性

这一版本2.X也是目前最通用的Hadoop版本,但是由于2013年6月份Spark发布,2013年10月Hadoop2.X版本发布,所以Spark在计算框架领域已经占得先机了。

二、Spark的历史

正是因为Hadoop1.X版本MR的缺点,诞生了Spark这个效率更高更强大的分布式计算框架;

·   2009年Spark诞生于加州大学伯克利分校AMPLab,项目采用Scala语言编写;

·   2010年开源;

·   2013年6月,由于Hadoop1.X版本中MR的缺点,Spark成为Apache孵化项目;

·   2014年2月,Spark成为Apache的顶级项目

->   Spark架构组成

(1)Master是资源调度管理器,

(2)ApplicationMaster类似Yarn中Application,应用管理器,为节点向Master申请资源并分配给Worker,

(3)Worker是工作节点,具备工作的资源环境,

(4)Executor实现计算任务。

Spark中数据操作走向,与Hadoop中MR框架的区别是,每一个MR过程是连接在一起的,数据并没有存储到HDFS中,在mapper和reducer中间是shuffle阶段,这一阶段数据处理完毕后可能会落盘;Spark的数据既可以保存在内存中也可以保存在磁盘中;

Spark使用Scala语言支持迭代计算和图形计算,并且由于Spark基于内存计算,避免了MR中的IO,所以Spark的执行效率非常高;

(1)落盘的情况下,Spark数据处理比Hadoop快近10倍,

(2)不落盘基于内存运算的情况下,Spark数据处理比Hadoop快近100倍。

ps:RDD是直接缓存在Executor进程中的,所以任务在运行时可以充分利用缓存数据加速运算,这也是Spark在内存中计算的原理。

->   Driver和Executor

在API开发中,Spark的驱动器Driver,就是执行开发程序中的main方法的进程,也就是声明SparkContext的那个方法;它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行,它对标ApplicationMaster。

Executor执行器,是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。如果Executor节点出现故障,Spark会将出错节点上的任务调度到其他Executor节点继续运行,实现了高可用和负载均衡;它对标Spark架构图中的Executor。

猜你喜欢

转载自blog.csdn.net/wx1528159409/article/details/86617990