大数据云计算——hadoop组件

1.1hadoop的概念

Hadoop是 Apache基金会下一个开源的分布式计算平台,它以分布式文件系统HDFS和MapReduce算法为核心,为用户提供了系统底层细节透明的分布式基础架构。用户可以在不了解分布式底层细节的情况下,充分利用分布式集群进行高速运算和存储。

1.2Hadoop的基本组成

Hadoop是一个大数据解决方案。它提供了一套分布式系统基础架构.核心内容包含HDFS和mapreduce。hadoop2.0以后引入Yarn.HDFS是提供数据存储的,mapreduce方便数据计算的。

1. HDFS又对应namenode 和 datanode. namenode 负责保存元数据的基本信息,datanode 直接存放数据本身;主要是为了解决海量数据的存储工作。

2. mapreduce 对应 jobtracker 和 tasktracker. jobtracker 负责分发任务, tasktracker 负责执行具体任务;主要是为了解决海量数据的计算问题

3. 对应到 master/slave 架构, namenode 和 jobtracker 就应该对应到 master, datanode

和 tasktracker 就应该对应到 slave。

4.Yarn :是作业的调度和集群资源的管理框架:主要是是为了解决任务的调度工作。

1.3Hadoop的生态圈

Hadoop的生态圈中有很多产品的:

HDFS:分布式文件系统

HIVE:基于Hadoop的分布式数据仓库

HBASE:基于Hadoop的海量数据库

Zookeeper:分布式服务协调组件

Mahout:分布式机器学习库

Oozie:工作流调度框架

Sqoop:数据导入导出工具

Flume:数据日志采集框架

Impala:基于hadoop的实时分析框架。

  1. HDFS的分布式存储系统

2.1HDFS 的基本原理

2.1.1NameNode

NamaeNode是HDFS的核心也是master nameNode仅仅存储的HDFS原数据,文件系统中的文件的所有的树目录,并跟踪真个集群的文件。NameNode不存储实际的数据的和数据集数据的本身在DataNodes中,Namenode知识知道HDFS任何文件中的块列表的具体的位置,使用这个NameNode知道如何从快中构建文件。NameNode并不持久化的存储每一个文件在中和每个DataNodede的位置信息。这些信息在系统启动的时候从数据的节点的重建。NameNode是HDFS的关键在NameNode关闭的时候集群是无法访问的、namenode是hadoop的集群的点点故障。Namenode所在的机器是会配置大量的内存RM的。

2.1.2DataName

DataNode是负责实际的数据的存储的在HDFS中的。在集群中也是slave的这样一个说法。Namenode和dataNode湿会保持不断的通信的。在DataNode启动的是将自己的发布到NameNode中。当DataNode关闭的时候不会影响猪呢个集群的可用性。Namenode 将安排和其他的数据的DataNode管理的块惊醒复制。复制dataNode中所在的机器中有大量的硬盘的空间,是因为大量的数据存储在其中。

https://img2018.cnblogs.com/blog/1721350/201907/1721350-20190724121237434-1189571085.png

HDFS上问价在物理上是分块存储的。每一个块的代销是默认是128M.

2.2HDFS的写流程

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729205822422-678186615.png

1客户端通过对DistributedFileSystem对象调用create()来新建对象。

2DistributedFileSystem对NameNode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有响应的数据块。NameNode执行各种不同的检查以确保这个文件不存在以及客户端有新建该文件的权限。

1如果这些检查均通过,NameNode就会为创建新文件记录一条记录;DistributedFileStream向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。就像读取事件一样,文件系统数据输出流控制一个DFSOutputStream,负责处理datanode和namenode之间的通信。

2否则,文件创建失败并向客户端抛出一个IOException异常。

3在客户端写入数据时,DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为“数据队列”(data queue)。DataStreamer处理数据队列,它的责任是挑选出适合存储数据复本的一组DataNode,并据此来要求NameNode分配新的数据块。这一组DataNode构成一个管线——我们假设复本数为3,所以管线中有3个节点。

4DataStream将数据包流式传输到管线中第1个DataNode,该DataNode存储数据包并将它发送到管线中的第2个DataNode。同样,第2个DataNode存储该数据包并且发送给管线中的第3个(也是最后一个)DataNode。

5DFSOutputStream也维护着一个内部数据包队列来等待DataNode的收到确认回执,称为“确认队列”(ack queue)。收到管道中所有DataNode确认信息后,该数据包才会从确认队列删除。如果有DataNode在数据写入期间发生故障,则执行以下操作(对写入数据的客户端是透明的)。

1首先关闭管线,确认把队列中的所有数据包都添加回数据队列的最前端,以确保故障节点下游的DataNode不会漏掉任何一个数据包。

2为存储在另一正常DataNode的当前数据块指定一个新的标识,并将该标识传送给NameNode,以便故障DataNode在恢复后可以删除存储的部分数据块。

3从管线中删除故障DataNode,基于两个正常DataNode构建一条新管线。

4余下的数据块写入管线中正常的DataNode。

5NameNode注意到块复本量不足时,会在另一个节点上创建一个新的复本。后续的数据块继续正常接受处理。

6客户端完成数据的写入后,对数据流调用close()。

7在联系到NameNode告知其文件写入完成之前,此操作会将剩余的所有数据包写入DataNode管线并等待确认。NameNode已经直到文件由哪些块组成(因为Datastreamer请求分配数据块),所以它在返回成功前只需要等待数据块进行最小量的复制。

2.3HDFS的读取流程

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729203006403-597776326.png

1、HDFS客户端通过调用FileSyste对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是DistributedFileSystem的一个实例。

2、DistributedFileSystem通过使用远程过程调用(RPC)来调用NameNode,以确定文件起始块的位置。对于每个块,NameNode返回具有该块副本的DataNode地址。此外,这些DataNode根据它们与客户端的距离来排序(根据集群的网络拓扑),如果该客户端本身就是一个DataNode,便从本地读取数据。接着DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端以便读取数据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着DataNode和NameNode的 I/O。

3、客户端对这个输入流调用read()方法,存储着文件起始几个块的DataNode地址的DFSInputStream随即连接距离最近的文件中第一个块所在的DataNode。

4、通过对数据流反复调用read()方法,可以将数据从DataNode传输到HDFS 客户端。

5、读取数据到块的末端时,DFSInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode。在HDFS客户端所看来它一直在读取一个连续的流,这些对于客户端来说是透明的。

6、客户端从流中读取数据时,块是按照打开DFSInputStream与DataNode新建连接的顺序读取的,它也会根据需要询问NameNode来检索下一批数据块的DataNode的位置,一旦客户端读取完毕,就会调用close()方法。但在读取时,DFSInputStream与DataNode通信时遇到错误,会尝试从这个块的另外一个最邻近DataNode读取数据,它也会记住那个故障DataNode,以保证以后不会反复读取该节点上后续的块。DFSInputStream也会通过校验和确认从DataNode发来的数据是否完整。如果发现有损坏的块,DFSInputStream会试图从其他DataNode读取其复本,也会将被损坏的块通知给NameNode

HDFS读数据过程这一设计的一个重点是:客户端可以直接连接到DataNode检索数据,且NameNode告知客户端每个块所在的最佳DataNode,由于数据流分散在集群中的所有DataNode,所以这种设计能使HDFS扩展到大量的并发客户端。同时,NameNode只需要响应块位置的请求(这些信息存储在内存中,因而非常高效),无需响应数据请求,否则随着客户端数量的增长,NameNode会很快称为瓶颈。

这里HdfsDataInputStream是FSDataInputStream的子类,这里是通过子类创建父类对象。

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729205752286-587862972.png

  1. MapReduce计算模型

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。主要思想是函数式编程语言中的"Map"和"Reduce"概念,来实现海量数据运算的分而治之

Hadoop-mapreduce是hadoop中一个批量计算的框架,在整个mapreduce作业的过程中,包括从数据的输入,数据的处理,数据的数据输出这些部分,而其中数据的处理部分就要map,reduce,combiner等操作组成。在一个mapreduce的作业中必定会涉及到如下一些组件:

1、客户端,提交mapreduce作业

2、yarn资源管理器,负责集群上计算资源的协调

3、yarn节点管理器,负责启动和监控集群中机器上的计算容器(container)

4、mapreduce的application master,负责协调运行mapreduce的作业

5、hdfs,分布式文件系统,负责与其他实体共享作业文件。

3.1MapReduce架构:

Mapreduce2.0架构图

a、Client

与MapReduce 1.0 的Client类似,用户通过Client与YARN交互,提交MapReduce作业,查询作业运行状态,管理作业等。

b、MRAppMaster

功能类似于 1.0 中的JobTracker ,但不负责资源管理;

功能包括:任务划分、资源申请并将之二次分配个Map Task和Reduce Task。

a、MRAppMaster 容错性

   一旦运行失败,由YARN 的ResourceManager 负责重新启动,最多重启次数可由用户设置,默认是2 次。一旦超过最高重启次数,则作业运行失败。

b、Map Task/Reduce Task

  Task 周期性向MRAppMaster 汇报心跳;

  一旦Task 挂掉,则MRAppMaster 将为之重新申请资源,并运行之。最多重新运行次数可由用户设置,默认4 次。

MapReduce的执行流程:

1向资源管理器(ResourceManager)请求,要运行一个程序。中获取新的作业ID(jobId),以及程序资源存储路径

2ResourceManager检查作业的输出说明,然后返回一个存放程序资源的路径以及jobId,这个路径在hdfs的tmp文件夹中,如果程序中没有指定输出目录或指定的输出目录已经存在,作业就不提交,错误返回给MapReduce程序就是这个路径存放程序资源,包括切边信息,程序的jar包,job.xml配置文件等。

3客户端去计算作业的输入分片,把job对象序列化为job.XML配置文件,里面全是 key,value。并把切边序列化成文件保存到hdfs的资源路径下,如果无法计算,比如因为输入路径不存在,作业就无法提交,将错误返回给Mapreduce程序。作业客户端检查作业的输出说明,在计算输入分片

4将作业资源(包括JAR、配置和分片信息)复制到HDFS,默认保存10份。

5通过调用资源管理器上的submitApplication()方法提交作业。

6资源管理器收到调用它的submitApplication()消息后,如果容器不够,任务会现在等待队列中等待,之后便将请求传递给调度器(Schedule),调度器分配一个容器,然后资源管理器在节点管理器的管理下在容器中启动应用程序master进程也就是MRAPPMaster。

MapReduce作业的application master是一个Java应用程序,它的主类是MRAPPMaster他对作业进行初始化,通过创建多个薄记对象以保持对作业进度的跟踪,因为他将接受来自任务的进度和完成报告

7MRAPPMaster根据切边信息,获知要启动多少个mapTask,向ResourceManager请求容器

8一旦资源管理器的调度器为任务分配了容器,MRAPPMaster(application master) 就通过与节点管理器NodeManager通信来启动容器向已获得容器的mapTask或reduceerTask发从启动命令,也就是主类为YarnChild程序

https://img-blog.csdn.net/20180420165100710?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FBNTE4MTg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

MapReduce的应用场景

1、  简单的数据统计,比如网站pv 、uv 统计

2、  搜索引擎建索引

3、  海量数据查找

4、  复杂数据分析算法实现

5、  聚类算法

6、  分类算法

7、  推荐算法

3.2MapReduce的序列化

Yarn的架构和原理

YARN是Hadoop 2.0的资源管理器。它是一个通用的资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

YARN的基本设计思想是将Hadoop 1.0中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。其中ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理,其基本架构如下图所示:

https://img-blog.csdn.net/20160714170531731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

YARN总体上仍然是Master/Slave结构。在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,并通过HA方案实现了ResourceManager的高可用。ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。

ResourceManager:它是一个全局的资源管理器,负责整个系统的资源管理和分配,主要由调度器和应用程序管理器两个组件构成。

调度器:根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。调度器仅根据应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。

应用程序管理器:负责管理整个系统中所有的应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

ApplicationMaster:用户提交的每个应用程序均包含1个ApplicationMaster,主要功能包括与ResourceManager调度器协商以获取资源、将得到的任务进一步分配给内部的任务、与NodeManager通信以启动/停止任务、监控所有任务运行状态并在任务运行失败时重新为任务申请资源以重启任务等。

NodeManager:它是每个节点上的资源和任务管理器,它不仅定时向ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态,还接收并处理来自ApplicationMaster的Container启动/停止等各种请求。

Container:它是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当ApplicationMaster向ResourceManager申请资源时,返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

1Yarn的工作流程

https://img-blog.csdn.net/20160714170556982?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

步骤1:用户向YARN中提交应用程序,其中包括用户程序、ApplicationMaster程序、ApplicationMaster启动命令等。

步骤2:ResourceManager为应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。

步骤3:ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后ApplicationMaster为各个任务申请资源,并监控它们的运行状态,直到运行结束,即重复步骤4-7。

步骤4:ApplicationMaster用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

步骤5:一旦ApplicationMaster成功申请到资源,便开始与对应的NodeManager通信,要求它启动任务。

步骤6:NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

步骤7:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,使ApplicationMaster能够随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

步骤8:应用程序运行完成后,ApplicationMaster通过RPC协议向ResourceManager注销并关闭自己。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41605937/article/details/106812804