HDFS 采用主从体系架构管理文件系统,HDFS 的系统架构如图3.1 所示,一个HDFS 的分布式集群由单个NameNode、多个DataNode 和Client 组成。其中,NameNode 是一个中心服务器,也称为主节点,它主要用来管理HDFS 的名称空间、处理客户端读写请求、管理数据块映射信息、配置副本策略等。DataNode 是数据节点,也称为从节点,它主要负责存储实际的数据块和执行数据块的读写操作,一个文件被分解成一个或多个数据块,这些块数据被存储在一组DataNode 上。值得注意的是:一个节点只能运行一个DataNode 进程。Client 是客户端,它主要负责与NameNode 交互获取文件的位置信息,与DataNode 交互读取或写入数据,而且它还提供了一些命令,可以管理HDFS,比如NameNode 的格式化等。
图3.1 HDFS 系统架构图
前面对HDFS 的体系结构进行了介绍,以下将介绍HDFS 的相关概念。
(1)数据块Block
数据块是HDFS 中每个磁盘都有的默认存储最小单位,数据块是文件存储处理的逻辑单元,这种概念与Linux 文件系统中的磁盘块类似。HDFS 上的文件系统被划分为多个块作为独立的存储单元,其大小可以已通过Hadoop 的配置参数“dfs. blocksize”来规定,在Hadoop 2. x版本中Block 的默认大小被定义为128 MB,而在老版本中一般大小为64 MB。这就好比一个大文件会被拆分成一个个的块,然后存储于不同的机器。如果一个文件少于Block 大小,那么实际占用的空间为其文件的大小。
数据块信息可以通过Hadoop 的Web 界面查看到,从图3.2 可知,存储在HDFS 的文件名称为“helloworld.txt”,且该文件存储在slave2 和slave1 两个DataNode 上,数据块池ID 为“BP-1743969542-192.168.6.100-1578923091266”,该存储块的BlockID 为“1073741993”,可以在节点slave1 和节点slave2 上找到该文件的数据块,并查看其内容。
图3.2 数据块Web 界面
打开slave1 节点,进入路径“/home/apache/data/hdfs/data/current/BP-1743969542-192.168. 6. 100-1578923091266/current/finalized/subdir0/sundir0”,然后查看数据块“ blk _1073741993”,发现内容与“helloworld.txt”的内容完全一致,因此,该数据块信息与Web 界面完全对应;还可以查看slave2 节点的数据块内容,同样可以发现该文本的数据块副本,如图3.3所示。
图3.3 slave 节点数据块内容
(2)副本存放策略
为了保证数据节点或机架出现故障后数据的完整性,每个块都会被复制到多台DataNode上,默认复制三份,并且分布在两个机架内的三个节点上,存放的原则如下:
①Block 副本放在与Client 所在的Node 里(如果所在Node 太忙,也会随机选择)。
②副本放置在与第一个节点不同的机架中的Node 中。
③副本与第二个在同一个机架,随机放在不同的Node 中。
如图3.4 所示,当一个DataNode 出现故障后,因为A 数据块存储在两个机架上且有三个副本,所以可以保证数据不丢失且正常运行。
图3.4 DataNode 故障(www.xing528.com)
如图3.5 所示,当一个机架出现故障后,因为A 数据块存储在两个机架上且有三个副本,所以依旧可以保证数据不丢失。
图3.5 机架故障
(3)元数据节点NameNode
NameNode 是分布式系统中的主节点,也称为中心服务器,它是HDFS 的主从结构中的中心枢纽,存储着元数据等重要信息。元数据包括两个部分:文件与数据块的映射表、数据块与数据节点的映射表。NameNode 的四个功能:管理HDFS 的名称空间、配置副本策略、管理数据块的映射信息、处理客户端读写请求。
图3.6 反映了NameNode 将元数据保存到磁盘上的流程。该元数据包括两个文件,即Fsimage 和Editlogs。
Fsimage 是在NameNode 启动时对整个文件系统的快照,Editlogs 是在NameNode 启动后对文件系统的改动序列。只有在NameNode 重启时,Editlogs 才会合并到Fsimage 文件中,从而得到一个文件系统的最新快照。
图3.6 NameNode 保存数据流程
(4)数据节点DataNode
DataNode 是分布式系统中的从节点,也称为slaver。它是HDFS 中的工作节点,用于存放数据块Block,一个集群中可以一个NameNode 和多个DataNode。DataNode 通常以机架的形式组织,机架之间通过交换机将整个系统连接起来。DataNode 的功能有两个:存储实际的数据块和执行数据块的读写操作。可以通过图3.1 看到在分布式系统中DataNode 的位置。
(5)辅助元数据节点SecondaryNameNode
上文提及只有在NameNode 重启时,Editlogs 才会合并到Fsimage 文件中,从而得到一个文件系统的最新快照。但是,在产品集群中NameNode 是很少重启的,而在运行过程中Editlogs就会变得越来越大,使得其很难管理。
SencondaryNameNode 就是用来解决这种问题的,它的主要作用是合并NameNode 的Editlogs 到Fsimage 文件中,从而解决Editlogs 越来越大的问题。它的其他作用还包括:辅助NameNode,分担工作量;在紧急情况下可以辅助恢复NameNode。但是,需要注意的是:SencondaryNameNode 并不是NameNode 的热备,当NameNode 宕机时,它并不能马上替换NameNode 并提供服务。
如图3.7 所示,SecondaryNameNode 的工作流程如下:
①SecondaryNameNode 定时到NameNode 去获取Editlogs,并更新到Fsimage 上。
②一旦它有了新的Fsimage 文件,它将其拷贝回NameNode 中。
③NameNode 在下次重启时会使用这个新的Fsimage 文件,从而减少重启的时间。
图3.7 SecondaryNameNode 工作流程
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。