一、产生背景

 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

二、 设计目标及使用场景

1.存储非常大的文件:这里非常大指的是几百M、G、或者TB级别。实际应用中已有很多集群存储的数据达到PB级别。

2.采用流式的数据访问方式: HDFS基于这样的一个假设:最有效的数据处理模式是一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 
分析工作经常读取其中的大部分数据,即使不是全部。 因此读取整个数据集所需时间比读取第一条记录的延时更重要。

3.运行于商业硬件上: Hadoop不需要特别贵的、reliable的(可靠的)机器,可运行于普通商用机器(可以从多家供应商采购) ,商用机器不代表低端机器。在集群中(尤其是大的集群),节点失败率是比较高的HDFS的目标是确保集群在节点失败的时候不会让用户感觉到明显的中断。

4.适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用

三、优缺点

1.优点

(1)高容错性

数据自动保存多个副本。它通过增加副本的形式,提高容错性。 某一个副本丢失以后,它可以自动恢复

(2)适合大数据处理

数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据:
文件规模:能够处理百万规模以上的文件数量,数量相当之大
可构建在廉价机器上,通过多副本机制,提高可靠性

(3)流式文件访问

一次性写入,多次读取,保证数据一致性

(4)可构建在廉价机器上

通过多副本提高可靠性,提供了容错和恢复机制

2.缺点

(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的

(2)无法高效的对大量小文件进行存储

存储大量小文件的话,它会占用 Namenode大量的内存来存储文件目录和块信息。这样是不可取的,因为 Namenode的内存总是有限的: 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

(3)不支持并发写入、文件随机修改HDFS

一个文件只能有一个写,不允许多个线程同时写,并且仅支持数据 append(追加),不支持文件的随机修改

四、HDFS核心概念

1.   Blocks

物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512 Byte。文件系统在物理Block之上抽象了另一层概念,文件系统Block物理磁盘Block的整数倍。通常为几KB。Hadoop提供的df、fsck这类运维工具都是在文件系统的Block级别上进行操作。

HDFS的Block默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。

HDFS的Block为什么这么大? 
是为了最小化查找(seek)时间,控制定位文件与传输文件所用的时间比例。假设定位到Block所需的时间为10ms,磁盘传输速度为100M/s。如果要将定位到Block所用时间占传输时间的比例控制1%,则Block大小需要约100M。 
但是如果Block设置过大,在MapReduce任务中,Map或者Reduce任务的个数 如果小于集群机器数量,会使得作业运行效率很低。

Block抽象的好处 
block的拆分使得单个文件大小可以大于整个磁盘的容量,构成文件的Block可以分布在整个集群, 理论上,单个文件可以占据集群中所有机器的磁盘。 
Block的抽象也简化了存储系统,对于Block,无需关注其权限,所有者等内容(这些内容都在文件级别上进行控制)。 
Block作为容错和高可用机制中的副本单元,即以Block为单位进行复制。

2.Namenode

整个HDFS集群由Namenode和Datanode构成master-worker(主从)模式。Namenode是Master节点。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间

3.DataNode:

Slave节点。负责存储client发来的数据块block;执行数据块的读写操作。默认有三个datanode也称为三副本备份机制

4.SecondaryNameNode

合并编辑日志,分担namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。

namenode内存中存储的是=fsimage+edits。

SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。

5.热备份

b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。

6.冷备份

b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。

7.fsimage:

元数据镜像文件(文件系统的目录树。)

8.edits

元数据的操作日志(针对文件系统做的修改操作记录)

五、工作原理

1.写操作

hdfs设计简单文件模型需求 hdfs设计目标_hdfs设计简单文件模型需求

详细步骤分析

  1. 根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
  2. namenode返回是否可以上传
  3. client请求第一个 block该传输到哪些datanode服务器上
  4. namenode返回3个datanode服务器ABC
  5. client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
  6. client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
  7. 当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

2.读数据流程

hdfs设计简单文件模型需求 hdfs设计目标_元数据_02

详细步骤解析

  1. 跟namenode通信查询元数据,找到文件块所在的datanode服务器
  2. 挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
  3. datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
  4. 客户端以packet为单位接收,现在本地缓存,然后写入目标文件

 六、元数据

namenode对数据的管理采用了三种存储形式:
内存元数据(NameSystem)
磁盘元数据镜像文件
数据操作日志文件(可通过日志运算出元数据)

何为元数据?HDFS元数据,按类型分,主要包括以下几个部分:

(1)文件、目录自身的属性信息,例如文件名,目录名,修改信息等。

(2)文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等。

(3)记录 HDFS 的 Datanode 的信息,用于 DataNode 的管理。

七、secondarynamenode工作机制

第一阶段:namenode启动

(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求

(3)namenode记录操作日志,更新滚动日志。

(4)namenode在内存中对数据进行增删改查

第二阶段:Secondary NameNode工作

       (1)SecondaryNameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。

       (2)SecondaryNameNode请求执行checkpoint。

       (3)namenode滚动正在写的edits日志

       (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode

       (5)SecondaryNameNode加载编辑日志和镜像文件到内存,并合并。

       (6)生成新的镜像文件fsimage.chkpoint

       (7)拷贝fsimage.chkpoint到namenode

       (8)namenode将fsimage.chkpoint重新命名成fsimage

 NameNode与SecondaryNameNode 的区别与联系?

1)机制流程同上;

2)区别

(1)NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。

(2)SecondaryNameNode主要用于定期合并命名空间镜像和命名空间镜像的编辑日志。

3)联系:

       (1)SecondaryNameNode中保存了一份和namenode一致的镜像文件(fsimage)和编辑日志(edits)。

(2)在主namenode发生故障时(假设没有及时备份数据),可以从SecondaryNameNode恢复数据。