Hadoop记录-hadoop介绍
1.hadoop是什么?
Hadoop 是Apache基金会下一个开源的大数据分布式计算平台,它以分布式文件系统HDFS和MapReduce算法为核心,为用户提供了系统底层细节透明的分布式基础架构。
2.hadoop主要组成部分
1)hdfs分布式存储文件系统---海量数据存储,大文件被分成默认64M一块的数据块分布存储在集群机器中
2)Yarn资源管理与作业调度
3)MapReduce算法---数据计算(并行计算框架)
3.hadoop特点
可靠、高效、可伸缩、容错、不适合低延迟数据访问、可处理大规模集群海量数据
4.hadoop集群组成部分
NameNode,DataNode,SecondaryNameNode,Yarn ResourceManager-(JobTracker,TaskTracker)、NodeManager。
1)NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点,同时保存了文件系统运行的状态信息。
2)DataNode中存储的是被拆分的blocks。
3)SecondaryNameNode帮助NameNode收集文件系统运行的状态信息。
4)JobTracker当有任务提交到Hadoop集群的时候负责Job的运行,负责调度多个TaskTracker。
5)TaskTracker负责某一个map或者reduce任务。
hadoop集群遵从M/S主从结构分布,DataNode一般分布在从节点上。
5.MapReduce介绍
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。它极大的方便编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。它的实现是map函数和Reduce函数组成。
Hadoop为每一个input split创建一个task调用Map计算,在此task中依次处理此split中的一个个记录(record),map会将结果以key--value的形式输出,hadoop负责按key值将map的输出整理后作为Reduce的输入,Reduce
Task的输出为整个job的输出,保存在HDFS上。
简单的说:MapReduce框架的核心步骤主要分两部分:Map和Reduce。当你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。Reduce对数据做进一步处理之后,输出最终结果。
MapReduce由Client、JobTracker、TaskTracker、Task组成,如图:
1)Client
用户编写的MapReduce程序通过Client提交到JobTracker。
2)JobTracker
主要负责资源监控和作业调度。JobTracker监控所有TaskTracker与作业的健康情况,一旦有失败情况后,其会将相应的任务给到其他节点上。
3)TaskTracker
它会周期的将本节点资源使用和任务进度汇报给jobtracker,方式叫做“心跳”;与此同时接受jobTracker发送过来的命令并执行操作。
4)Task
Task分为Map Task和Reduce Task两种,有TaskTracker启动。
Map Task:将对应的输入信息解析成一个个的key/value对,调用map函数进行处理,最终将临时结果放到本地磁盘上,临时数据会被分成若干个partition,每个partition对应一个Reduce Task。
Reduce Task过程:从节点上读取Map Task中间结果;按照key对key/value对进行排序;调用reduce函数,将结果保存到HDFS上
执行流程:
1)作业提交:首先有Client将作业相关信息上传到HDFS上,然后通知JobTracker。JobTracker接收到请求之后,有作业调度进行初始化,JobTracker会创建一个JobInProgress进程,作用是跟踪作业运行状况,并且为每个Task创建一个TaskInProgress来跟踪每个人物的运行状态。
2)任务调度和监控:TaskTracker周期性的通过心跳向jobTracker汇报节点的资源使用情况,JobTracker按照一定策略选择一个合适的任务使用该空闲资源,这个就是任务调度器完成的工作了。另外JobTracker还要完成监控的作用,负责跟踪作业的整个与性过程,如果Tasktracker或者Task失败,将转移计算任务。
3)任务环境准备:TaskTracker为每个Task启动一个JVM避免不同Task之间的冲突。
4)任务执行:启动Task,运行过程中,每个Task通过RPC的方法是汇报给TaskTracker,再有TaskTracker汇报给JobTracker
5)作业完成:所有的Task执行完毕后,整个作业执行成功。
6.HDFS介绍
1)Hadoop Distributed FileSystem,Hadoop分布式文件系统。
a.Block:HDFS默认的基本存储单位是64M的数据块,和普通文件系统相同的是,HDFS中的文件是被分成64M(新版128M)一块的数据块存储的。 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
b.元数据节点(NameNode)和数据节点(DataNode)
2)HDFS特点
(1) 超大文件数据集群
(2) 流式数据访问方式读取文件
(3) 对硬件要求并不是特别高,有很好的容错机制。
(4) 数据访问有一定的延迟,这是因为HDFS优化的是数据吞吐量,是要以提高延迟为代价的。
(5) HDFS无法高效存储大量小文件,因为NameNode限制了文件个数。
(6) HDFS不支持多个写入者,也不支持随机写。
3)体系结构
(1)HDFS由Client、NameNode、DataNode、SecondaryNameNode组成。
(2)Client提供了文件系统的调用接口。
(3)NameNode由fsimage(HDFS元数据镜像文件)和editlog(HDFS文件改动日志)组成,NameNode在内存中保存着每个文件和数据块的引用关系。NameNode中的引用关系不存在硬盘中,每次都是HDFS启动时重新构造出来的。
(4) SecondaryNameNode的任务有两个:a.定期合并fsimage和editlog,并传输给NameNode;b.为NameNode提供热备份。
(5)一般是一个机器上安装一个DataNode,一个DataNode上又分为很多很多数据块(block)。数据块是HDFS中最小的寻址单位,一般一个块的大小为64M,不像单机的文件系统,少于一个块大小的文件不会占用一整块的空间。
(6)设置块比较大的原因是减少寻址开销,但是块设置的也不能过大,因为一个Map任务处理一个块的数据,如果块设置的太大,Map任务处理的数据量就会过大,会导致效率并不高。
(7)DataNode会通过心跳定时向NameNode发送所存储的文件块信息。
(8)HDFS的副本存放规则
默认的副本系数是3,一个副本存在本地机架的本机器上,第二个副本存储在本地机架的其他机器上,第三个副本存在其他机架的一个节点上。
这样减少了写操作的网络数据传输,提高了写操作的效率;另一方面,机架的错误率远比节点的错误率低,所以不影响数据的可靠性。
4)数据流向过程
读取过程说明
(1)HDFS客户端调用DistributedFileSystem类的open()方法,通过RPC协议请求NameNode来确定说请求的文件所在位置,找出最近的DataNode节点的地址。
(2)DistributedFileSystem会返回一个FSDataInputStream输入流对象给客户端。
(3)客户端会在FSDatatInputStream上调用read()函数,按照每个DataNode的距离从近到远依次读取。
(4)读取完每个DataNode后,在FSDataInputStream上调用close()函数。
(5)如果读取出现故障,就会读取数据块的副本,同时向NameNode报告这个消息。
写入流程说明
(1)客户端调用DistributedFileSystem对象的create()方法,通过RPC协议调用NameNode,在命名空间创建一个新文件,此时还没有关联的DataNode与之关联。
(2)create()方法会返回一个FSDataOutputStream对象给客户端用来写入数据。
(3)写入数据前,会将文件分割成包,放入一个“数据队列”中。
(4)NameNode为文件包分配合适的DateNode存放副本,返回一个DataNode的管道。
(5)根据管道依次保存文件包在各个DataNode上。
(6)各个DataNode保存好文件包后,会返回确认信息,确认消息保存在确认队列里,当管道中所有的DataNode都返回成功的的确认信息后,就会从确认队列里删除。
(7)管道中所有的DataNode都保存完成后,调用FileSystem对象的close()关闭数据流。
7.Yarn介绍
YARN是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。其中,ResourceManager负责所有资源的监控、分配和管理;ApplicationMaster负责每一个具体应用程序的调度和协调;NodeManager负责每一个节点的维护。对于所有的applications,RM拥有绝对的控制权和对资源的分配权。而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task。
ResourceManager
ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。
NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。
YARN Scheduler根据application的请求为其分配资源,不负责application job的监控、追踪、运行状态反馈、启动等工作。
NodeManager
NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。
NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。
NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求。
ApplicationMaster
用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。
负责与RM调度器协商以获取资源(用Container表示)。
将得到的任务进一步分配给内部的任务(资源的二次分配)。
与NM通信以启动/停止任务。
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。
注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。
执行过程
1)client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
2)ResourceManager启动一个container用于运行ApplicationMaster。
3)启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。
4)ApplicationMaster向ResourceManager发送请求,申请相应数目的container。
5)ResourceManager返回ApplicationMaster的申请的containers信息。申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。AM与NM保持心跳,从而对NM上运行的任务进行监控和管理。
6)container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。
7)应用运行期间,client直接与AM通信获取应用的状态、进度更新等信息。
8)应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。