Hadoop(HDFS、MapReduce、Yarn)总结

1.什么是大数据?
大数据(Big Data)是指“无法用现有的软件工具提取、存储、搜索、共享、分析和处理的海量的、复杂的数据集合。

2.大数据的特点

业界通常用4个V(即Volume、Variety、Value、Velocity)来概括大数据的特征。

一.是数据体量巨大(Volume)。
截至目前,人类生产的所有印刷材料的数据量是200PB(1PB=210TB),而历史上全人类说过的所有的话的数据量大约是5EB(1EB=210PB)。当前,典型个人计算机硬盘的容量为TB量级,而一些大企业的数据量已经接近EB量级。

二.是数据类型繁多(Variety)。
这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求。

三.是价值密度低(Value)。
价值密度的高低与数据总量的大小成反比。以视频为例,一部1小时的视频,在连续不间断的监控中,有用数据可能仅有一二秒。如何通过强大的机器算法更迅速地完成数据的价值“提纯”成为目前大数据背景下亟待解决的难题。

四.是处理速度快(Velocity)。
这是大数据区分于传统数据挖掘的最显著特征。根据IDC的“数字宇宙”的报告,预计到2020年,全球数据使用量将达到35.2ZB。在如此海量的数据面前,处理数据的效率就是企业的生命。

3.Hadoop是什么
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

优点 (4高):
1.高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖 。
2.高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中 。
3.高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快 。
4.高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配 。
5.低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。
Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。

4.Hadoop有哪些发行版?
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
Apache版本最原始(最基础)的版本。
Cloudera在大型互联网企业中用的较多。
Hortonworks文档较好。

5.Hadoop的组成(面试重点)

在这里插入图片描述

6.HDFS架构概述

在这里插入图片描述

7.YARN架构概述

在这里插入图片描述

8.MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce

1)Map阶段并行处理输入数据

2)Reduce阶段对Map结果进行汇总

在这里插入图片描述

9.大数据技术生态体系

在这里插入图片描述

图中涉及的技术名词解释如下:

1)Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySql)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

2)Flume:Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性:

(1)通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。

(2)高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。

(3)支持通过Kafka服务器和消费机集群来分区消息。

(4)支持Hadoop并行数据加载。

4)Storm:Storm用于“连续计算”,对数据流做连续查询,在计算时就将结果以流的形式输出给用户。

5)Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。

6)Oozie:Oozie是一个管理Hadoop作业(job)的工作流程调度管理系统。

7)Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。

8)Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

10)R语言:R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。

11)Mahout:Apache Mahout是个可扩展的机器学习和数据挖掘库。

12)ZooKeeper:Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、 分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

10.推荐系统框架图

在这里插入图片描述

**

Hadoop之HDFS总结

**
1.什么是HDFS文件系统?
HDFS是大数据开源框架hadoop的组件之一,全称(Hadoop Distributed File System),它是一个分布式文件系统,由多台服务器联合起来实现文件存储功能,通过目录树来定位文件,集群中的服务器都有有各自的角色。

2.HDFS文件系统有什么特点?
优点
1.数据通过副本存储,提高容错性
2.能够处理PB级及以上数据,可处理百万级文件数量
3.节约成本,可分布在“廉价”机器上
缺点
4.不适合低延时数据访问
5.不适合对大量文件的存储和访问
6.单线程操作文件不能多用户执行写操作,并且不支持文件随机修改
3.HDFS组成架构

在这里插入图片描述

在这里插入图片描述

4.HDFS默认数据块得大小是多少?为什么?
HDFS目前默认块大小在Hadoop2.x版本中是128M,老版本中是64M,因为目前磁盘的传输率约为100M/s,而HDFS读取文件时最佳的寻址时间为10ms,寻址时间为传输时间的百分之1时最佳,所以定义块大小为128M,1秒左右可以快速读取完毕;本质上HDFS的块大小取决于磁盘的传输速率。

5.为什么HSDFS不支持存储小文件?
存储大量小文件会占用NameNode大量的内存和磁盘来存储文件目录和块信息。是不可取的,因为NameNode的内存是有限的;
读取小文件时寻址时间会超过读取时间,不合理,违反了HDFS的设计目标.
6.Hadoop fs | hdfs dfs 命令分类
本地文件 -> HDFS
-put 将本地数据上传至hdfs
-copyFromLocal 将本地文件数据拷贝到hdfs
-moveFromLocal 将本地文件数据移动到hdfs,成功后本地数据会删除
-appendToFile 追加一个文件到已经存在的文件末尾

HDFS与HDFS之间
-ls 查看hdfs文件目录
-mkdir 在HDFS上创建目录
-rm 删除文件或者文件夹
-rmr | -rm -r 递归删除
-cp 从一个目录拷贝文件至另一目录
-mv 在HDFS目录中移动文件
-chown 修改文件所属用户权限
-chmod 修改文件所属读写权限
-du -h 文件夹暂用的空间大小
-df -h 查看系统分区情况
-cat 查看文件

HFDS -> 本地
-get 从hdfs下载文件至本地
-getmerge 合并hdfs目录下的文件至本地
-copyToLocal 从hdfs拷贝文件至本地

其他
-setrep 设置文件副本数(注意:具体的副本数得看DataNode的数量)
-help 帮助命令

7.HDFS写数据流程

1.首先客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2.NameNode返回是否可以上传。
3.如果文件大于128M则分块存储,客户端请求第一个 Block上传到哪几个DataNode服务器上。
4.NameNode根据副本储存策略返回3个DataNode节点,假如为dn1、dn2、dn3。
5.客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求调用dn2,dn2调用dn3,建立通信管道完成,dn1、dn2、dn3逐级应答客户端。
6.客户端以Packet为单位往dn1上传第一个Block数据,dn1收到Packet就会传给dn2,dn2传给dn3;dn1,dn2,dn3每接收packet会放入一个待写队列等待写入数据,落盘。
7.当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器,重复执行3-6步。

在这里插入图片描述
备注:1.block要有一个上传成功了,就算成功了,后面namenode会做异步的同步

       2.每传一个block都会向namenode请求

       3.上传数据时,datanode的选择策略:

将一个副本放置在本地机架中的一个节点上,将另一个副本放置在本地机架中的另一个节点上,最后一个副本放置在不同机架中的另一个节点上(一个副本在Client所处的节点上。如果客户端在集群外,随机选一个,第二个副本和第一个副本位于相同机架,随机节点,第三个副本位于不同机架,随机节点)。

优点:该策略减少了机架间的写流量,通常可以提高写性能。机架故障的机会远小于节点故障的机会。此策略不会影响数据的可靠性和可用性保证。

8.HDFS读数据流程

在这里插入图片描述

1.客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2.挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3.DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4.客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

9.Namenode和secondarynamenode的工作机制

  1. NameNode启动和工作内容
    1.1第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,会加载编辑日志和镜像文件到内存。
    1.2客户端对元数据进行增删改的请求。
    1.3NameNode记录操作日志,更新滚动日志。
    1.4NameNode在内存中对元数据进行增删改。
  2. Secondary NameNode工作内容
    2.1 2NN询问NN是否需要CheckPoint(合并镜像和编辑日志),并带回NameNode是否执行结果。
    2.2 2NN请求执行CheckPoint
    2.3 NN滚动正在写的Edits编辑日志。
    2.4 将滚动前的编辑日志和镜像文件拷贝到2NN。
    2.5 2NN加载编辑日志和镜像文件到内存,并执行合并,生成新的镜像文件fsimage.chkpoint。
    2.6 2NN拷贝fsimage.chkpoint到NN。
    2.7 NN将fsimage.chkpoint重新命名成fsimage,替换之间旧的fsimage

10.fsimage和edits文件分别指的是什么?存的是什么?
fsimage:HDFS文件系统元数据的镜像文件,其中包含HDFS文件系统的所有目录和文件inode及相关属性的序列化信息。
edits:用户操作的编辑日志文件,存放HDFS文件系统的所有更新操作的动作,文件所有写操作会被记录到Edits文件中。

11.默认情况下进行ckeckpoint(合并镜像及编辑日志)的触发条件是什么?
默认情况下,2NN每隔一小时执行一次checkpoint;
默认情况下,一分钟检查一次Edits文件的操作次数,当操作次数达到1百万时,2NN执行一次checkpoint。

12.NameNode故障处理
方法一:将2NN所在服务器元数据存储目录namesecondary中数据拷贝到NameNode存储元数据的name目录下,重新开启服务即可。
方法二:使用-importCheckpoint选项启动NameNode守护进程,将2NN所在服务器元数据存储目录namesecondary拷贝到NameNode所在服务器的同级目录下,导入检查点数据,重新开启服务即可。
1.修改hdfs-site.xml中的

dfs.namenode.checkpoint.period
120

dfs.namenode.name.dir /opt/module/hadoop-2.7.2/data/tmp/dfs/name 导入检查点数据:hdfs namenode -importCheckpoint

13.集群安全模式

1.NameNode启动时,会将镜像文件(Fsimage)和编辑日志(Edits)加载到内存。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode处于安全模式。当数据块的副本数不满足(dfs.replication.min=1)最小副本数时,不会主动退出安全模式;
2.安全模式下:NameNode的文件系统对于客户端来说是只读的。
3.(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
注意:集群正常启动完成后,自动退出安全模式,如果无法正常退出可使用hdfs dfsadmin -safemode leave退出安全模式;对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。

14.DataNode工作机制

在这里插入图片描述

datanode会先向namdnode注册,namdnode返回注册成功;后每一小时datanode向namenode上传块信息,每3秒datanode向namenode发送一次心跳包,并携带namenode给datanode的命令,默认情况下如果超过10分30秒namenode没有收到datanode的心跳,则任务datanode掉线。

15.DataNode多目录设置
DataNode也可以配置成多个目录,并且每个目录存储的数据不一样。
编辑hdfs-site.xml文件,添加如下配置项,这里块数据会分布存储在data1和data2目录中

dfs.datanode.data.dir
file:/// h a d o o p . t m p . d i r / d f s / d a t a 1 , f i l e : / / / {hadoop.tmp.dir}/dfs/data1,file:/// hadoop.tmp.dir/dfs/data1,file:///{hadoop.tmp.dir}/dfs/data2

**

Hadoop之MapReduce总结

**
1.MapReduce的定义
MapReduce是一个分布式运算程序的编程框架。

MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发行在Hadoop集群上。

2.MapReduce的优缺点
优点

1.MapReduce 易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。就是因为这个特点使得MapReduce编程变得非常流行。
2.良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3.高容错性
MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。
4.适合PB级以上海量数据的离线处理
它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce很难做到。

缺点

MapReduce不擅长做实时计算、流式计算、DAG(有向图)计算。
1.实时计算
MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。
2.流式计算
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
3.DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

3.Hadoop序列化
Hadoop序列化的特点?如何实现序列化?序列化和反序列化时要注意什么?
(1) hadoop序列化之序列化必要数据,所以具有紧凑、快速高效、可扩展、互操作的特点。
(2)必须实现Writable接口,重写序列化public void write(DataOutput out)方法和反序列化public void readFields(DataInput in)方法。
(3)序列化时要注意数据的数据类型,注意反序列化的顺序和序列化的顺序完全一致。

4.FileInputFormat切片机制

默认情况下为了避免mr处理数据的过程中存在网络数据传输,从而降低mr的效率,默认的切片大小为block块大小(128M),FileInputFormat中getSplits()方法会根据文件大小将文件拆分成splits,如果单个文件较小小于128的1.1倍,则每个文件为一个split,并将文件按行分割形成<key,value>对,如果单个文件较大。超过block块(128M)默认大小得1.1倍,则会将文件切分为多个split,切片数量决定了maptask的任务数量。

5.MapReduce工作流程
MapTask工作机制如图所示。

在这里插入图片描述

(1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
(3)Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
溢写阶段详情:
步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号Partition进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。
步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。
步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。
(5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。

ReduceTask工作机制,如图所示。

在这里插入图片描述

(1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
(3)Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(4)Reduce阶段:reduce()函数将计算结果写到HDFS上。

6.Shuffle机制

key,value从map()方法输出后,被outputcollector收集通过HashPartitioner类的getpartitioner()方法获取分区号,进入环形缓冲区。默认情况下,环形缓冲区为100MB。当环形环形缓冲区存储达到80%,开始执行溢写过程,溢写过程中如果有其他数据进入,那么由剩余的20%反向写入。溢写过程会根据key,value先根据分区进行排序,再根据key值进行排序,后生成一个溢写文件(再对应的分区下根据key值有序),maptask将溢写文件归并排序后落入本地磁盘,reduceTask阶段将多个mapTask下相同分区的数据copy到指定的reduceTask中进行归并排序、分组后一次读取一组数据给reduce()函数。

7.Partition分区
mr默认的reduceTask数量是多少?mr默认是如何为key,value分配分区的?总结如何自定义分区?使用自定义分区的注意事项(reducetask和分区的关系)?
(1)默认的reduceTask数量为1意味着所有的mapTask处理后的数据都会交给这个reduceTask进行数据的汇总,最终输出一个文件
(2)数据在经过map方法的context.write()写出后,会通过outputcollector收集,底层调用HashPartitioner类的getPartition()方法通过(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks模得到的,但是用户没法控制哪个key存储到哪个分区。
(3)自定义分区首先需要定义一个类,继承自Partitioner,实现getPartition()方法根据具体需求返回对于的分区号,最后通过job.setPartitionerClass()设置分区类

public class FlowPartitioner extends Partitioner<Text,FlowBean> {
public int getPartition(Text text, FlowBean flowBean, int numPartitions) {
//分区号从0开始:5reducetask 5个分区:0~4
//手机号136、137、138、139开头都分别放到一个独立的4个文件中,
//其他开头的放到一个文件中。
String phonenum = text.toString();
switch (phonenum.substring(0,3)){
case “136”:
return 0;
case “137”:
return 1;
case “138”:
return 2;
case “139”:
return 3;
default:
return 4;
}
}
}

(4)注意:
分区号从0开始,不要跳号
当分区数量大于reduceTask数量时,程序运行出错
当设置reduceTask的数量为一时,不走分区方法
当设置的reduceTask数量大于分区时,会产生空的输出文件

8.WritableComparable排序
mapreduce在那些阶段(位置)实现了排序?默认是怎么排序的?如何自定义排序?
(1)MapTask和ReduceTask均会对数据按照key进行排序。
MapTask,会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值(100M的百分之80)后,对缓冲区中的数据进行一次快速排序,并将有序数据溢写到磁盘上,最后会对磁盘上所有文件溢写文件进行归并排序。
ReduceTask,从每个MapTask上拷贝对应分区的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。

(2)排序操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,默认排序是按照字典顺序排序,实现该排序的方法是快速排序。
(3)我们需要在数据对象类中实现WritableComparable接口中的 compareTo方法(自然比较方法),从而实现对当前对象和传入对象的比对,实现排序。

9.Combiner合并
(1)Combiner是MR程序中Mapper和Reducer之外的一种组件,继承自reducer,是可选的,并不是必须存在的,因为只有在不影响最终业务结果的场景下才能使 用。Combiner的作用就是对每一个MapTask的输出进行局部汇总,以减小网络传输量
(2)Combiner是在每一个MapTask所在的节点运行;Reducer是接收全局所有Mapper的输出结果。

10.GroupingComparator分组(辅助排序)
定义类继承自WritableComparator,重写compare()方法通过对象中的某一个或者多个参数比对,参数相同则视为同一组数据进入到reduce方法中。
注意:使用时需要创建一个构造器将比较对象的类传给父类(不然会报出Null…空指针异常)

Hadoop之Yarn总结

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。

1.Yarn基本架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如图所示。

在这里插入图片描述
ResourceManager:
处理客户端请求;
监控nodemanager;
启动或监控ApplicationMaster;
Yarn的资源调度与调控。

NodeManager:
管理单个节点给上的资源;
处理来自ResourceManager的命令;
处理来自NodeManager的命令。

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

Container:
是一个容器,是yarn中的资源抽象,它封装了某个节点上多维度的资源.

2.Yarn工作机制

在这里插入图片描述

1.mr程序提交到客户端所在的节点;
2.YarnRunner向ResourceManager申请一个application;
3.ResourceManager向YarnRunner返回资源路径;;
4.将job资源路径提交到HDFS上;
5.资源提交完毕后,申请运行mrAppMater;
6.将用户的请求初始化成一个Task;
7.其中一个NodeManager领取到任务,
8.该NodeManager创建容器,并产生appMaster;
9.下载job资源到本地;
10.mrAppMaster向RM申请运行mapTask容器;
11.RM分配任务给另外两台Nodemanager,分别领取到任务并创建容器;
12.mrAppMaster向接收到任务的2个NodeManager发送程序启动脚本,这2个NodeManager分别启动mapTask,mapTask对数据进行分区排序;
13.所有的mapTask任务运行完,mrAppMaster向RM申请2个容器,运行reduceTask程序;
14.reduceTask向mapTask获取相应分区的数据;
15.mr程序运行完后,会向RM申请注销自己.

3.资源调度器
FIFO、Capacity Scheduler和Fair Scheduler。Hadoop2.7.2默认的资源调度器是Capacity Scheduler

FIFO:只有一条任务队列,job任务按照时间顺序,先进的排在前面优先处理,一次只能处理一个任务
Capacity Scheduler:由多个FIFO队列组成,可以为队列进行资源的分配,任务在各队列中按照时间顺序排列,先进的排在前面优先处理,支持任务的并行执行。
Fair Scheduler:由多个队列组成,可以为队列进行资源的分配,任务在各队列中按照差额排列,差额越大,任务优先分配到资源优先执行,
但是公平调度器会保证每个job任务都能分配到一定的资源执行任务,所以公平调度器同样支持任务的并行执行;但是要使用公平调度器集群服务器的性能一定高,
不然任务分配的资源少,导致任务的执行效率低。

4.任务的推测执行
(1)任务推测执行机制作用:如果某个任务运行速度远慢于任务平均速度,则为执行慢的任务开启一个备份任务,同时运行,谁先运行完,则采用谁的结果,可以提高mr的整体效率。

(2)原理:采用以空间换时间的策略,根据任务当前的执行进度和执行时间,推算出任务执行完毕的时刻T1,
同时根据任务的平均执行时间和当前时间,计算出备份任务执行完成时刻T2,MR总是选择(T1 - T2)差值最大的任务,为之启动备份任务,
注意:在集群资源紧缺的情况下,应合理使用该机制,在用少量资源的情况下,减少作业的计算时间。

MapReduce开发总结
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43777152/article/details/109159805
今日推荐