HDFS的体系结构
HDFS采用主从(Master/Slave)结构模型,将节点分为两类,包括一个处于运行状态的NameNode和若干DataNode。
- NameNode服务器负责管理和维护HDFS的目录系统并且控制文件的读写操作。
- 多个DataNode服务器负责存储数据。下图中只展示出了3个DataNode,实际大型集群可以有成千上万个结点。

HDFS的设计前提与目标
- 硬件故障时常态而非异常
- HDFS是设计运行在低成本的硬件之上,硬件股将是常态而非异常,所以HDFS被设计成具有高度容错的能力,能试试监测错误并自动恢复,是一个核心目标。
- Streaming流式数据存储
- 运行在HDFS之上的应用会通过Streaming存取数据集。HDFS的只要设计是批处理,而非实时互动处理,所以优点是可以提高大量数据的存取能力,但牺牲了响应时间。
- 大数据集
- 集群可以扩充至数百个节点来存储大数据集。HDFS提供了cluster集群结构来存储大数据文件。
- 简单一致性模型
- HDFS的模式是一次写入多次读取。一个文件被创建后就不会再修改。这样设计的优点是:可以提高存储大数据的能力,并简化一致性问题。
- 移动“计算”比移动“数据”成本更低
- 挡在集群中存储大量数据时,要办一数据必须耗费大量时间成本。因此如果我们有计算数据的需求时,计算功能在接近数据的服务器中运行,而不是搬移数据。
HDFS文件存储架构
HDFS允许用户以文件形式存储数据,文件被分成若干数据块,而且这些数据块存放在一组DataNode上。HDFS对文件的存储有以下要点:

- 文件分割
- 当用户以HDFS命令要求存储文件时,系统会将文件切割成多个区块(Block),每个区块大小为64MB,如上图中文件被切分为A,B,C共3个区块。
- 区块副本策略
- 一个文件区块默认会被复制成3份,你也可以在Hadoop配置中设置文件区块要创建几个副本。
- 文件区块损坏时,NameNode会自动寻找位于其他DataNode上的副本来恢复数据,维持3份的副本策略。
- 机架感知
- 上图中有Rack1,Rack2,Rack3共3个机架,每个机架都有4个DataNode服务器。
- HDFS具备机架感知功能,如上图所示,以Block C为例,第一副本位于Rack1机架上某结点;第二份位于Rack1机架上另一节点,最后一份位于不同机架Rack3上的不同节点。
- 这样设计的好处是防止数据遗失,有任何节点或机架出现故障可以保证回复数据,提高数据安全性。
NameNode是整个HDFS的核心,它通过维护一些数据结构来记录每一个文件被分割成多少块、这些块可以从哪些DataNode中获取,以及各个DataNode的状态等重要信息。NameNode执行文件系统的命名空间操作,如打开、关闭、重命名或目录等,也负责数据块到具体DataNode的映射。
DataNode负责处理文件系统客户端的文件读写操作,并在NameNode的统一调度下进行数据块的创建、删除和复制操作。
HDFS的运行机制
- 可靠性保障
- 冗余机制——数据备份
- 故障检测——DataNode(心跳包、块报告、数据完整性监测);NameNode(日志和镜像)
- 读文件流程
- 客户端调用DistributedFileSystem对象的open()方法
- DistributedFileSystem通过RPC联系namenode,得到所有数据块信息,对每个数据块,namenode返回存有该块副本的datanode地址,并且这些datanode根据他们与客户端的距离进行排序
- DistributedFileSystem类返回一个FSDataInputStream对象给客户端并读取数据
- 客户端对该对象调用read()方法读取数据
- FSDataInputStream连接距离最近的datanode读取数据,数据读取完毕时FSDataInputStream会关闭与该datanode的连接,然后寻找下一个块的datanode
- FSDataInputStream可能并行读取多个datanode,当客户端完成读取时,对FSDataInputStream调用close()方法
- FSDataInputStream从datanode读取数据时如果遇到错误,会尝试从该块的另外一个最近的datanode读取数据,并记住故障datanode保证以后不会继续从该节点读取其他块
- 每个读取的块通过校验和确认以保证数据完整
- 如果FSDataInputStream发现一个损坏的块,则在从其他datanode读取块之前通知namenode
- 写文件流程
- 客户端调用DistributedFileSystem对象的create()方法创建文件
- DistributedFileSystem通过RPC联系namenode,namenode执行各种检查确保待建立的文件不存在,且客户端拥有创建该文件的权限
- 如果检查通过,namenode为新文件创建一条记录,否则抛出一个IOException异常
- DistributedFileSystem给客户端返回一个FSDataOutputStream对象进行写数据
- FSDataOutputStream将待写入数据分成数据包并写入内部队列dataqueue
- DataStreamer处理dataqueue,根据datanode列表要求namenode分配适合的新块来存储数据备份
- namenode分配的数据备份datanode(通常3个)形成一个管线,DataStreamer将数据包传输给管线中的第一个节点,然后该节点存储完之后发送给第二个节点,以此类推
- FSDataOutputStream维护一个确认队列ackqueue,当收到管线中所有datanode的确认后,该数据包从确认队列中删除
- 如果datanode发生故障,则关闭管线,将确认队列中的数据包添加回数据队列的最前端,将故障的数据块和datanode信息返回给namenode以便该datanode恢复后删除错误数据块,从管线中删除错误节点,并把剩余数据块写入正常datanode
- 如果复本数量不足,则namenode根据datanode分配新的datanode并创建新的复本,该datanode被加入管线继续正常存储
本文深入解析HDFS(Hadoop分布式文件系统)的主从结构、设计目标、文件存储方式及运行流程,阐述其如何通过冗余机制、机架感知等功能实现高可用性和数据安全性。

2716

被折叠的 条评论
为什么被折叠?



