HDFS应知应会的原理

HDFS全称为Hadoop Distributed File System,是一个为大(数据)文件专门设计的分布式文件系统。

三大特点

高容错,高吞吐量,可使用低成本硬件是HDFS具有的三大特点。

高容错

HDFS设计之初就假设硬件发生故障是正常现象,因此具备快速检测故障,从故障中恢复的能力,也就是高容错。

高吞吐量

通过计算邻近数据的理念,一次写入多次读取的数据一致性模型,以及文件分块集群存储,支持流式数据访问等方式使HDFS具有很高的数据吞吐量。

低成本部署

HDFS本身的设计目标之一就是支持低成本的通用硬件部署,由于本身是Java语言编写的缘故,HDFS可以很容易的在各种不同的平台间移植。

实现

核心架构

HDFS在核心架构上分为两部分:NameNode和DataNode。
这是一种主从结构,主为NameNode,负责管理文件系统,诸如文件系统上有哪些文件,具体的文件数据存储在集群中的哪个位置之类的信息都是有NameNode维护的,NameNode也负责协调客户端对文件的访问,指导客户端对文件进行读写。DataNode为从,负责管理所在节点上的数据存储,接受客户端的读写具体数据块的请求,按NameNode的指令进行文件冗余以及数据块的增删操作。
这种NameNode维护文件系统的管理数据,DataNode负责文件的实际内容数据,一个文件被分割为一个或多个块交由DataNode负责存储,管理的架构,使得文件的实际内容数据是不会流经NameNode,可以直接从多个不同的DataNode获取,这也是HDFS具有高吞吐量的一个原因。
HDFS架构
NameNode和DataNode之间通过心跳检测让NameNode知道DataNode是否正常,块报告通信让NameNode知道DataNode上存储的块数据的情况,这些通信协议被以RPC的方式封装调用。
类似与NameNode和DataNode间的通信,客户端和NameNode间的通信协议也被封装为RPC的方式在调用。
这种架构可以实现对GB或TB级别大数据文件的处理,但是也可以看到HDFS适合存储大数据,对于海量小数据要求的分布式存储并不是HDFS最初的设计目标。

通用的文件系统接口

HDFS是一种在某些特性上有所放松的POSIX文件系统,所以概念和使用上和常见的*nix系统中的文件系统基本一致,具有文件,目录,用户的概念,在shell命令的设计上也基本可以对等。类似的,HDFS也提供垃圾桶(回收站)的概念,配置激活垃圾桶功能后,删除的文件默认会被存储到/user/<username>/.Trash, 垃圾桶中存在的文件,可以被快速的恢复。
如果一个文件被删除了,由于HDFS分布式的特性,对应的数据块删除需要一定的时间,所以可能会观察到在客户端删除操作返回后, HDFS上可用的存储容量在并为立刻改变,而是一段时间后才增加。

文件系统元数据存储

之前有提到过NameNode负责整个HDFS的文件系统层面的数据管理,在NameNode运行的过程中,会在内存中镜像一份HDFS的文件系统结构,客户端对文件系统的操作都基于内存立刻完成,但是当需要NameNode停机的时候,这些数据如何回写磁盘,显然不能在简单的依赖停机的时候的回写,那样很容易造成文件系统数据丢失。对此HDFS采用FsImage和EditLog双文件记录,定期检查同步的方式来保证文件系统元数据的存储。
FsImage存储了文件系统的整个命名空间,文件到块的映射数据也存在该文件中,EditLog负责记录自上次FsImage更新依赖发生的所有文件系统的变更操作记录,这样用FsImage+EditLog就能反应出最新的文件系统状态,加载FsImage,并应用EditLog的过程发生在启动以及检查点时间到达的时候,检查点时间是可以按需配置的。

高可靠性的保障

数据冗余

文件数据的高可用是通过冗余来实现的(具体说是基于数据块的冗余),冗余的份数可以通过配置副本系数控制,默认为3。冗余的具体操作发生在DataNode之间,客户端只向一个DataNode节点写数据,该DataNode在接收数据的同时和其他DataNode建立管道,并行同步数据,如果副本系数大于2,那么可能出现多个DataNode在并行同步数据的情况。
HDFS块复制
在副本存放位置的算法方面,HDFS会基于具体的网络,集群架构做一个尽可能高可用,安全性更高的决定。比如会考虑机架间互备比机架内不同节点互备安全这类的问题。此外HDFS也支持在此算法之上配置一些额外的关于存储类型方面的策略。
数据被冗余存储,就可以被从许多不同的地方读取,读取时HDFS也有自己的一套策略,会优先考虑数据与客户端的位置因素,就近读取。

数据完整性校验

HDFS客户端在存储每个数据块时,都会计算一个校验值并作为隐藏文件和数据块存储在同一命名空间下,在读取的时候客户端会依次校验数据的完整性,如果数据有错误,客户端可以从其他的DataNode上获取其他的块副本。

文件系统元数据的安全机制

FsImage和EditLog都是存储在本地文件系统的文件,所以一旦这两个文件出问题,那么HDFS就会故障,为此HDFS也有一些冗余同步这两个文件的机制可以配置使用,以及可以使用分布式的存储方式改善这个问题。

文件系统快照

如同其他文件系统一样,HDFS具有文件系统快照的功能,该功能可以快照某一时间点的部分或整个文件系统,并且非常高效。

发布了106 篇原创文章 · 获赞 15 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/skyupward/article/details/103450817
今日推荐