一、HDFS简介
1.1Hadoop2介绍
hadoop1是由HDFS和MapReduce组成,hadoop2由HDFS、YARN、MapReduce和其他的计算框架组成。
(1)核心
HDFS——用于海量数据存储;MapReduce——分布式计算;YARN——资源管理系统。
(2)改进
YARN——运行更多种类框架;
NameNode HA——同时启动2个NameNode。其中一个处于工作(Active)状态,另一个处于随时待命(Standby)状态;
HDFS federation——由多个Namenode和一组Datanode组成,每一个Datanode会为多个块池(block pool)存储块。
Hadoop RPC序列化扩展性——将数据类型模块从RPC中独立出来,成为一个独立的可插拔模块
1.2HDFS概述
HDFS是一个分布式文件系统,具有高容错、高可靠、高可扩展性、高吞吐率的特点。它可以部署在廉价的通用硬件上,适合需要处理海量数据集的应用程序。
(1)主要特性
支持超大文件——几百M、GB甚至TB级的数据文件
检测和快速应对硬件故障——HDFS的检测和冗余机制很好克服了大量通用硬件平台上的硬件故障问题
流式数据访问——HDFS更关注数据访问的高吞吐量
简化一致性模型——一次写入、多次读取的访问模式
(2)HDFS不适合以下场景
低延迟数据访问;大量的小文件;多用户写入文件、修改文件。
(3)HDFS体系结构
由NameNode和DataNode构成。其中:
①NameNode上保存着HDFS的名字空间,任何对文件系统元数据产生修改的操作都作用于NameNode;
②DataNode将HDFS数据以文件的形式存储在本地文件系统中。
(4)数据块
数据块是HDFS的文件存储处理单元,在Hadoop 2中默认大小为128MB,可根据业务情况进行配置。
优点:HDFS可以保存比存储节点单一磁盘大的文件;简化了存储子系统、存储管理,并消除分布式管理文件元数据的复杂性;方便容错,有利于数据复制。
1.3HDFS读写流程
(1)读流程
①客户端向远程NameNode发送RPC请求;
②NameNode视情况返回文件部分或全部的block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;
③客户端开发库Client会选取离客户端最接近的DataNode来读取block。如果客户端本身就是DataNode,那么将从本地直接获取数据;
④读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;
⑤ 当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表;
⑥读取完一个block都会进行校验,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读取。
(2)写流程
①使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
②Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
③当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定;
④开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式;
⑤最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet;
⑥如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。
(3)创建子路径流程:通过namenode进行创建、新加记录。
(4)删除数据流程:客户端与namenode交互,namenode指定datanode删除相应的block。
二、YARN原理介绍
2.1 YARN产生背景
Hadoop 1.X缺陷:
①扩展性差:JobTracker同时兼备了资源管理和作业控制两个功能,严重制约了整个集群的扩展性;
②可靠性差:JobTracker存在单点故障,JobTracker出现问题将导致整个集群不可用;
③资源利用率低:基于槽位资源分布模式,无法有效利用各种资源;
④无法支持多种计算框架:Hadoop 1支持内存计算、流式计算、迭代式计算等多种计算框架并存的情况。
多种计算框架优点:资源利用率高;运维成本低;数据共享。
2.2 YARN基本架构
YARN是一种Hadoop资源管理器。它是一个通用的资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
(一)应用场景
长应用程序:不出意外,永不终止运行的应用程序,通常是一些服务,比如Storm Service(主要包括Nimbus和Supervisor两类服务),HBase Service(包括Hmaster和RegionServer两类服务)等;
短应用程序:一定时间内(可能是秒级、分钟级或小时级,尽管天级别或者更长时间的也存在,但非常少)可运行完成并正常退出的应用程序。
(二)结构图
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等几个组件构成。YARN总体上仍然是Master/Slave结构。ResourceManager为Master,NodeManager为Slave。ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。
①ResourceManager
作为一个全局的资源管理器,负责整个系统的资源管理和分配,主要由调度器和应用程序管理器两个组件构成。
调度器:将系统中的资源分配给各个正在运行的应用程序,可插拔组件,用户可根据需要设计新的调度器。
应用程序管理器:负责管理整个系统中所有的应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
②ApplicationMaster
用户提交的每个应用程序均包含1个ApplicationMaster,主要功能包括与ResourceManager调度器协商以获取资源,将得到的任务进一步分配给内部的任务。负责与NodeManager通信以启动/停止任务、监控所有任务运行状态并在任务运行失败时重新为任务申请资源以重启任务等。
③NodeManager
作为每个节点上的资源和任务管理器,定时向ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态,还接收并处理来自ApplicationMaster的Container启动/停止等各种请求。
④Container
它是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当ApplicationMaster向ResourceManager申请资源时,返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。
(三)流程图
①用户向YARN中提交应用程序,其中包括ApplicationMaster程序,启动ApplicationMaster的命令,用户程序等;
②ResourceManger为该程序分配第一个Container,并与对应的NodeManger通讯,要求它在这个Container中启动应用程序的ApplicationMaste;
③ApplicationMaste首先向ResourceMange注册,这样用户可以直接通过ResourceMange查看应用程序的运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结束,重复4-7的步骤;
④ApplicationMaste采用轮询的方式通过RPC协议向NodeManger申请和领取资源;
⑤一旦ApplicationMaste申请到资源后,便与对应的NodeManger通讯,要求它启动任务;
⑥NodeManger为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
⑦各个任务通过某个RPC协议向ApplicationMaste汇报自己的状态和进度,以让ApplicationMaste随时掌握各个任务的运行状态,从而可以在任务失败的时候重新启动任务;
⑧应用程序运行完成后,ApplicationMaste向ResourceManger注销并关闭自己。
三、MapReduce原理介绍
3.1 MapReduce介绍
MapReduce是由Google公司研究提出的一种面向大规模数据处理的并行计算模型和方法,是Hadoop面向大数据并行处理的计算模型、框架和平台。
MapReduce执行流:
3.2MapReduce2运行原理
基于YARN的Mapreduce2工作流程:
(一)具体流程为:
1.客户端向集群提交作业;
2.Job从ResourceManager获取新的作业应用程序ID;
3.客户端检查作业的输出情况,计算输入分片,并将作业jar包、配置、分片信息等作业资源复制到HDFS;
4.Job向ResourceManager提交作业;
5.ResourceManager接收到作业后,将作业请求传递给调度器,调度器根据作业信息为ResourceManager分配一个container,然后ResourceManager在NodeManager的管理下,在container中启动一个ApplicationMaster进程;
6.ApplicationMaster对作业进行初始化,并保持对作业的跟踪,判断作业是否完成;
7.ApplicationMaster接受来自于HDFS的分片信息,确定Map的数量,一个分片信息对应一个Map,而Reduce数量则可以在客户端中设置;
8.ApplicationMaster为本次作业的Map和Reduce以轮询的方式向ResourceManager申请container;
9.ApplicationMaster获取到container后,与NodeManager进行通讯启动container;
10.任务开始前将任务需要的资源(jar包、配置和分布式缓存文件等)本地化;
11.container启动Map、Reduce任务。
(二)MapReduce2进度状态更新:Map、Reduce任务向ApplicationMaster发送进度状况。
3.3 shuffle及排序
Mapreduce的map端输出作为输入传递给reduce端,并按键排序的过程称为shuffle。
shuffle流程图:
Map阶段:
1.每个map存在一个环形内存缓冲区(可以人为设置,默认为100M),若达到阈值(缓冲区大小的80%),后台内容溢出至磁盘。写过程以轮询方式将缓冲区内容写入特定路径。
其中:
partition——map端写入磁盘之前,线程首先根据reduce划分相应分区。每个分区中后台线程按照键排序。
combiner——相当于本地的reduce,可减少磁盘I/O或网络I/O。
2.map端可能会有很多的溢出文件,其任务完成前生成已经分区并排序的文件。默认map输出不进行压缩,不过可以设置数据压缩。
Reduce阶段:
Reduce通过http方式获得map端输出数据。若reduce接受的数据量相当小,则复制至reduce的缓冲区(可设置)中,否则复制至磁盘,并进行所有map输出数据的合并排序。最后对排好序的数据进行处理。