目录
一、简介
Hadoop是Apache Lucene创始人 卡大爷(Doug Cutting) 创建的。在项目Nutch中出现了问题:如何解决数十亿网页的存储和索引问题。2003年Google发表了一篇论文为该问题提供了可行的解决方案。论文中描述的是谷歌的产品架构,该架构称为:谷歌分布式文件系统(GFS),后面成为了Hadoop中的HDFS ;2004年 Google发表论文向全世界介绍了谷歌版的MapReduce系统,后面发展成为了Hadoop中的MapReduce。2006年Google发表了论文是关于BigTable的,这促使了后来的Hbase的发展。
发展到到现在,Hadoop有了两种定义,广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈;从侠义的角度来说这款开源框架,它的核心组件有:
HDFS(分布式文件系统):解决海量数据存储
YARN(作业调度和集群资源管理的框架):解决资源任务调度
MAPREDUCE(分布式运算编程框架):解决海量数据计算
二、HDFS
HDFS(Hadoop Distribute File System )又称Hadoop分布式文件系统,是Hadoop核心组件之一,解决的问题就是大数据存储。其中NameNode负责管理整个文件系统元数据;DataNode负责管理具体文件数据块存储;Secondary NameNode协助NameNode进行元数据的备份。HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode申请来进行。
1.1Namenode
NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件;但不存储实际数据或数据集,数据本身实际存储在DataNodes中;而且namenode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建(需要datanode汇报)。
当NN挂了,可以将SNN中的数据拷贝到NN储存数据的目录;同时也可以启动namenode守护进程,从而将SecondaryNameNode中数据拷贝到 namenode目录中
1.2Sconedarynamenode
1.3Datanode
DataNode负责将实际数据存储在HDFS中,同时会跟nn进行不断地通信,汇报自己的状态(心跳机制,默认3S)长时间nn没有接收dn汇报的信息,nn会认为dn挂了;在datanode启动时,它会汇报给NameNode是否已经成功启动,并汇报自己负责持有的块列表;block汇报时间间隔默认为6h
1.4HDFS的上传文件流程原理(写流程)
1)客服端向namenode请求上传文件,namenode收到请求,检查客户端是否有写的权限,同时检查目标文件是否已经存在,父目录是否存在。确认满足条件后namenode返回可以上传;
2)客服端请求上传一个block(128M,在客户端划分好)放在哪几个datanode,namenode返回datanode节点(dn1、dn2、dn3...)
3)客户端请求dn1上传数据,dn1收到请求后调用dn2,dn2调用dn3,建立一个pipeline管道,dn1、dn2、dn3逐级答应客户端;
4)客户端dn1上传第一个block,以数据包(packet 64k)的形式发送给dn1,然后dn1传给dn2,dn2传给dn3,dn1每传一个packet会放入一个应答队列等待应答;
5)当第一个block上传成功后,客户端再次请求namemode上传第二个(重复2-4步)
拓展:
在上传的过程中,pipeline可能会出现故障断开连接(dn1dn2dn3任意挂了):
只要有一个副本上传成功,HDFS会认为整个上传成功,剩下的副本将由namenode指定其他的dn进行复制即可;
如果一个副本都没有上传成功,客户端将会把这个消息告诉NN,将会重新分配dn建立管道。
1.5HDFS的下载文件流程原理(读流程)
2)客户端选取排序考前的dn来读取block,如果客户端就是dn,就从本地直接获取,否则就随机挑选dn请求读取数据(网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后);
三、mapreduce
MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。MapReduce的思想核心是“分而治之”,主要可以分成两步 :Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reduce负责“合”,即对map阶段的结果进行全局汇总。
2.1map
执行流程
1)把输入目录下的文件按照标准(默认情况下,Split size = Block size = 128M)逐个进行逻辑切片,每一个逻辑切片由一个maptask处理
2)对每个切片按照规则解析成为一个个<key,value>键值对
3)调用map方法,每次调用map方法会输出零个或多个键值对
4)按照一定的规则对3)输出的键值对进行分区。默认是只有一个区。分区的数量就是Reducer任务运行的数量。
5)对每个分区中的键值对进行排序 ,直接输出到文件,或者进入6)
6)对数据进行局部聚合处理,也就是combiner处理。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。
2.2reduce
1)Reducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此Reducer会复制多个Mapper的输出。
2) 把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
3)对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。
3.3shuffle机制
shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
1).Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。
2).Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
3).Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
4).Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5).Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
6).Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。
四、yarn
YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台。其主要作用资源管理、任务调度,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)(从集群角度只有RM、NM,从程序角度AM)。
3.1ResourceManage
ResourceManager(AM+RS)负责整个集群的资源管理和分配,是一个全局的资源管理系统。其中nm以心跳的方式向Rm汇报资源使用情况(第一报活,第二汇报CPU和内存的使用情况)RS根据AM的请求为其分配资源,不负责任务的监控、追踪、运行状态反馈、启动等工作。
3.2NodeManage
NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。并且定时向RM汇报资源使用情况和Container(资源容器)的运行状态,当RM宕机时,nm将自动链接RM的备用节点。nm接收并处理AM的Container的启动停止的各种请求。
3.3ApplicationMaster
ApplicationMaster负责每一个具体应用程序的调度和协调。用户提交的每个应用程序都包含一个AM(以MR程序为例 就有MRAM+maptask+resucetask),Am可以运行在RM以外的机器上,同时又与RS协商获取资源,并且将得到的任务进一步分配给内部自己的任务(资源二次分配),还可以与Nm通信启动停止任务。RM只负责监控AM,不负责AM内部任务的容错,任务的容错由AM完成,在任务运行失败时AM重新为任务申请资源以重启任务。
3.4Resource Scheduler(资源调度器)
Scheduler负责分配资源,在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。
FIFO把客户端提交的任务按顺序排成一个队列,在进行任务资源分配的时候,把最先进来的任务进行资源分配,当这个任务满足需求之后再分配资源给下一个任务,但是如果先提交的是一个大的任务,会造成堵塞,不能高效的完成任务需求。
capacity允许多个组织进行资源共享,使得每个任务都获得一定的计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,集群就可以通过设置多个队列的方式给多个组织提供服务。但在队列内还是采用的FIFO。
Fair调度器会为所有运行的任务动态的调整系统资源。如果提交了一个大的任务,他会获得所有的资源,当第二个小任务提交后,Fair调度器会划分一半资源给小任务(任务提交到获得资源会有一定的延迟),让这两个任务公平的共享集群资源。当小任务执行完后会释放资源,此时大任务会继续获取全部的资源。Fair调度器就是保证资源利用率又能保证小任务成功执行。
3.5运行流程
以MR程序为例
1)客户端提交程序给RM,其中包括(MRAM+maptask+resucetask等)
2)RM通过NM启动一个container运行MR的AM
3)启功成功的MRAM向Rm注册信息,并保持心跳
4)MRAM向RS发送请求申请资源,获取自己任务相对应的container数目
5)RM返回AM请求的信息并给相应的资源,Am将contanier初始化,与nm进行通信启动contanier,与nm保持心跳,对nm进行人物的监控和管理
6)container运行期间,MRAm对其进行监控,通过RPC协议汇报进度状态信息给Am
7)程序运行期间,客户端与MRAM进行通信获取相应的状态信息
8)MR程序运行结束后向Rm提交注销信息,回收相应的资源contanier