浅析一·Hadoop核心架构之HDFS浅析

XY个人笔记

     在正式开始学习大数据之前呢,自己简单的大量的搜寻了一下Hadoop的相关的资料和一些文章,算是先对Hadoop有一个比较简易通透的理解吧。本来计划把HDFS和MapReduce写在一起,后来自己理解的比较慢,而且放在一起会感觉很庞大,就把写了一半的MapReduce给拿掉了等着理解透彻了在发布,要不也不知道自己会多久以后再回来看了。

    Apache Hadoop是一个应用java语言实现的软件框架,再由大量的廉价的计算机组成的集群中运行海量数据的分布式并行计算框架,它可以让应用程序支持上千个节点和PB级别的数据。每当谈到Hadoop的起源,不得不提的就是Google的三驾马车,谷歌在03到06年间连续发表了三篇很有影响力的论文(hadoop的诞生离不开这三篇论文,足以证明这三篇论文的强大),分别是GFS、MapReduce、BigTable,也就是所说的三驾马车了。而Hadoop实际上就是谷歌三宝的开源实现,Hadoop MapReduce对应Google MapReduce,HBase对应BigTable,HDFS对应GFS

这里有Google三篇论文中英文的下载地址:

Google三大论文中文版下载

Google三大论文英文版下载

    Hadoop的两大核心架构是HDFS(Hadoop Distributed File System) 分布式文件系统和MapReduce(Map - 映射-对逻辑业务并行处理    Reduce - 归约-合并统计数据结果)。MapReduce提供了对数据的计算,一个并行计算框架,HDFS提供了对海量数据的存储,一个为访问应用数据提供高吞吐量的分布式文件系统。HDFS是根据Google的GFS论文概念模型设计实现的。

在论文中GFS的整体架构图:

浅析一·Hadoop核心架构之HDFS浅析

    HDFS参考了它的大部分设计架构,两个在架构上是类似的,比如HDFS的NameNode和GFS的Master,HDFS的DataNode和GFS的chunkserver。拿Google论文里面的图出来,主要是因为他比较强大,毕竟原始HDFS的起源嘛。只贴图不介绍 哈哈,对于GFS架构就不具体详细的介绍了,需要了解的话可以看看GFS的论文,里面有详细的介绍。

一、HDFS

    HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用,有着高容错性的特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序

    HDFS采用主从(Master/Slave)结构模型,HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,之前的版本中是64M。支持文件形式的数据主要由3个组件构成,分别是NameNodeSecondaryNameNodeDataNode,其中NameNode、SecondaryNameNode 运行在master节点,DataNode运行slave节点。一个HDFS集群是由一个NameNode和若干个DataNode组成的。

    HDFS的架构图:

浅析一·Hadoop核心架构之HDFS浅析


下面来说一下HDFS的三个组件:

    NameNode作为主服务器,负责客户端请求的响应和元数据(文件的名称、副本系数、Block存放的DataNode)的管理。管理文件系统命名空间和客户端对文件的访问操作,NameNode会将文件系统的Meta-data存储在内存中。这些信息主要包括了文件信息、每一个文件对应的文件块的信息以及每一个文件块在DataNode的信息。

        Namenode主要维护两个文件,一个是fsimage,一个是editlog

    fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。

    editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。

    简单一点理解,NameNode维护了文件与数据块的映射表以及数据块与数据节点的映射表,也就是说一个文件,切分成多个block,这些block分别存放在哪些DataNode上,都是有NameNode记录的。。fsimage就是在某一时刻,整个hdfs的快照,就是这个时刻hdfs上所有的文件块和目录,分别的状态,位于哪些个datanode,各自的权限,各自的副本个数。然后客户端对hdfs所有的更新操作,比如说移动数据,或者删除数据,都会记录在editlog中。

    为了避免editlog不断增大,secondaryNamenode会周期性(周期可以自己设置)合并fsimage和edits成新的fsimage和editlog,新生成的fsimage和editlog会替换旧的。


    DataNode管理存储的数据,存储用户文件对应的数据块(Block),DataNode要定期向NameNode发送心跳信息(既心跳机制 - 默认为3秒),汇报本身及其存储的block信息,健康状况。
    SecondaryNameNode辅助节点(NameNode的辅助节点),有两个作用,一是镜像备份,备份fsimage(fsimage是元数据发送检查点时写入文件);二是日志与镜像的定期合并,将Namenode中edits日志和fsimage合并,防止如果Namenode节点故障,namenode下次启动的时候,会把fsimage加载到内存中,应用edits log,edits log往往很大,导致操作往往很耗时。(这也是namenode容错的一套机制)。两个过程同时进行,称为checkpoint(检查点)。


HDFS读、写数据流程

    文件写入:

           a).Client向NameNode发起文件写入的请求,以确认可以写文件并获得接收文件block的DataNode。

        b).Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中,NameNode接收到block后把对应上传的数据节点返回给客户端。

        c).NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息(也可以理解为文件需要上传的节点)。

        d).建立传输通道,开始上传。

        e).由接收到block的DataNode负责向其他DataNode复制block的副本

    文件读取:

             a).Client向NameNode发起文件读取的请求。

        b).NameNode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表),并返把元数据返回给客户端。

        c).客户端收到元信息后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的datanode请求。

        d).Client通过socket读取文件信息,并把文件写入本地文件。

    文件Block复制

          a).NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。

        b).通知DataNode相互复制Block。

        c).DataNode开始直接相互复制。

    安全模式

        等待过程,处于安全模式,safemode安全模式下HDFS文件系统是只读的,进入"只读不写"的状态,Namenode每次启动的时候,在等待的过程中都是处于安全模式,并且安全模式下HDFS不能响应外部客户端的写操作请求(上传、删除等修改类操作),安全模式下客户端读取HDFS文件和下载HDFS文件到本地是可以的。Namenode从所有的 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。