首先我们先了解HDFS有哪些特性,设计初衷是什么,为了解决什么问题。

1,解决硬体错误问题。HDFS能够错误自检,快速自动恢复。

2,高吞吐量。HDFS中更多的是考虑数据的批处理,而不是用户的交互处理。

3,大规模的数据。能在一个集群里面很容易扩展到数百个节点。

4,简单的一致性模型。一个文件经过创建、写入和关闭之后就不需要改变。一次写入多次读取。从而简化了数据一致性的问题,并且使高吞吐量的数据访问成为可能。

5,移动计算比移动数据更加划算。HDFS为应用提供了将他们移动到数据附近的介面。

6,HDFS采取Master-Slave架构。一个Hdfs由一个namenode和一定数目的datanodes组成。

下图是HDFS架构示意图:

HDFS如何管理文件

1,HDFS支持层次型文件组织结构。文件系统名字空间的层次结构和大多数的文件系统类似,用户可以创建、删除、移动或者重命名文件。HDFS不支持用户磁碟配额和反问许可权控制,不支持软链接和硬链接,不支持文件的执行许可权。NameNode负责维护文件系统的命名空间,任何对文件的修改都被NameNode记录下来。

2,Hdfs将元数据信息存储在fsimag和edits。我们可以看看fsimag和edits中的内容。

3,HDFS的元数据存储机制:内存中有一份完整的元数据(内存meta data);磁碟有一个「准完整」的元数据镜像(fsimage)文件存储在namenode的工作目录中

4,NameNode如何管理元数据。

HDFS如何存储文件

1,数据文件存储在DataNode节点上,维护了blockId余DataNode本地文件的映射。需要保持和NameNode之间的心跳,来告知自己的信息,方便NameNode来管控集群。

2,Hdfs存储的最小单位是块。一个块默认是128M或者256M,每个块默认都存储三分。当然问价块的默认大小和存储数量都是可以调整的。

3,Hdfs如何写入文件。

文件按照流失的放入进行写入。一开始是写到本地临时文件中,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。

写入流程详细解释如下:

第一步:客户端向NameNode发出写文件请求。

第二步:检查是否已存在文件、检查许可权。若通过检查,直接先将操作写入EditLog,并返回输出流对象。

第三步:client端按设置的块大小切分文件。

第四步:client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。

第五步:返回确认消息

第六步:写完数据关闭数据流

第七步:发送完成信号给NameNode

HDFS保存文件的注意事项

1,WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了,由于在真实写操作之前,操作就被写入EditLog中了,故EditLog中仍会有记录,我们不用担心后续client读不到相应的数据块,因为在第5步中DataNode收到块后会有一返回确认信息,若没写成功,发送端没收到确认信息,会一直重试,直到成功。

2,Hdfs通过校验和,来保障数据的一致性。

3,假设写2T的数据,我们设置的是三个备份,那么需要6T的存储。

4,在读写的过程中,如果发现DataNode挂掉了,会把死掉的节点的数据,复制到其它节点上去。

5,挂掉一个节点,甚至挂掉一个机架也没有关系,在其它节点或者机架上有备份。如图HDFS副本放置策略。

以上我对这个问题的理解,您觉得hdfs还有那些问题没有说明的,关注头条号:数据僧,微信公众号:数据僧。在评论区留言,我们一起讨论学习。


hdfs保存数据分为三步,分别为元数据保存、数据储存和备份,元数据储存在namenode,文件数据及其副本储存在datanode。元数据写明文件数据怎么储存和储存在哪,有多少副本等等。


推荐阅读:
相关文章