1.来源
HDFS来源于Google在2003年10月份发表的FGS论文:《The Google File System》,HDFS是GFS克隆版。HDFS的全称是Hadoop Distributed File System。它是易于扩展的分布式文件,运行在大量的普通廉价机器上,提供了很好的容错机制。能够为大量用户提供新能不错的文件存取服务。
2.结构介绍
HDFS上的文件是以块来进行存储的,不是说1GB的文件就以1GB来存储,而是将1GB的文件分成很多块来进程存储,默认一个快的大小是128MB。
2.1 NameNode
客户端存取文件的信息都保存在NameNode上,对于NameNode有以下几点:
1.NameNode是一个中心服务器,单一结点负责管理文件系统的名字空间以及客户端对文件的访问。很多分布式的系统都采用这种主从的方式来设计,比如HBase、Kubernetes等。
2.文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,否则NameNode会成为系统的瓶颈。NameNode只负责处理要访问的数据与哪个DataNode相关。
3.副本存放在哪些DataNode上有NameNode来控制,根据全局情况作出块放置决定。客户端读取文件时NameNode尽量让客户端读取最近的副本,降低带宽的消耗和读取延时。
4.NameNode全权管理数据库的复制,它周期性的从集群中的每个DataNode接收心跳信号和快状态报告。心跳信号意味着该DataNode工作正常,块状报告显示该DataNode上的所有的数据块的列表。
NameNode和DataNode是通过RPG协议来进行数据的沟通的,包括心跳信号以及块状态报告。
2.2 DataNode
一个数据块在DataNode上以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据,包括数据块的长度,块数据的校验和以及时间戳。元数据可以用来判断该块是否损坏,比如块的长度不正确。
DataNode启动后会想NameNode注册,通过后,周期性的向NameNode上报所有的块信息。
心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的指令,包括复制块数据到另一台机器,或者删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则NameNode任务该节点不可用。
集群运行中可以安全的加入和退出一些机器。
2.3 文件存储
文件切分成块(默认大小为128M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可以在文件生成时指定,默认为3个。
NameNode是主节点,存储文件的元数据如文件名、文件目录结构,文件属性(生成时间、副本数,文件权限),以及每个文件的块列表和块所在的DataNode等信息。
DataNode在本地文件系统存储文件块数据,以及块数据的校验和。
可以创建、删除、移动或重命名文件,当文件创建、写入和关闭后不能修改文件的内容。hdfs上的文件不能修改,但是可以追加内容。
通过Hadoop的官网文档可以查看副本的保存策略,通常是在本地保存一个副本,然后在同一个机架上保存另外一份副本,在另外一个机架上保存第3个副本。一个机架指的是一个服务器机柜,通常都是在同一个网段中。
3.数据损坏处理:
当DataNode读取一个块的时候,会计算checksum(校验和)
如果计算后的checksum与块创建时的值不一样,则说明该块已经损坏。客户端会读取其他DataNode上的块
NameNode标记该块已经损坏,然后复制该块达到预期设置的文件副本数。
DataNode在其文件创建后三周验证其checksum,自动进行修复和保证完整性。
hdfs会有很多种办法来保证文件的准确性,确保数据不会丢失。