目录
介绍
Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data.
HDFS 是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的区别很明显:
- HDFS具有高度的容错能力,旨在部署在低成本硬件上。
- HDFS提供对应用程序数据的高吞吐量访问,并且适用于具有大数据集的应用程序。
- HDFS放宽了一些POSIX(可移植操作系统接口:Portable Operating System Interface,缩写为POSIX)要求,以实现对文件系统数据的流式访问。
- HDFS最初是作为Apache Nutch Web搜索引擎项目的基础结构而构建的。
设计初衷
- 硬件故障容错性:检测故障并从故障中快速自动恢复是HDFS的核心架构目标
- 流式数据访问友好性:首要能力是提高数据的吞吐率而非低延迟
- 支持大数据集合操作
- 简化一致性模型:减弱数据更新一致性,提升吞吐量
- 移动式计算而非移动数据:改变原有以计算为中心的思路,数据在哪儿,计算便在哪儿
- 可移植性:可轻松移植
设计初衷决定产品架构和最终形态!
架构
物理结构
HDFS的物理结构设计为主/从模式。物理集群由一个NameNode(负责管理文件系统命名空间,并控制客户端对文件的访问)以及许多数据节点DataNode组成。数据节点通常是每个物理节点一个,用于管理它们所运行节点的存储。在内部,文件被分成一个或多个块,这些块存储在一组DataNode中。
- NameNode执行与文件系统命名空间相关的操作,例如打开,关闭和重命名文件和目录。它还负责存储集群元数据,并记录数据块到DataNode的映射。
- DataNode负责处理来自文件系统客户端的读写请求,还会执行块的创建,删除操作,
注意:单个的NameNode是专门为简化系统体系设计,仅负责命名空间等控制性操作,且用户数据不会流向NameNode。
其他功能设计
文件系统命名空间
HDFS支持传统的分级文件模式。
- 用户或应用程序可以创建目录并将文件存储在这些目录中。
- 文件系统名称空间层次结构与大多数其他现有文件系统类似;可以创建和删除文件,将文件从一个目录移动到另一个目录或重命名文件。
- HDFS支持配额(允许管理员为使用的名称数和用于单个目录的空间量设置配额)和文件权限控制
- HDFS不支持硬链接或软链接(但是,HDFS并不排除实现这些功能)
NameNode维护文件系统的命名空间,对文件系统名称空间或其属性的任何更改都由NameNode记录,应用程序可以指定HDFS应该维护的文件副本的数量。
文件的副本数称为该文件的复制因子,此信息由NameNode存储。
数据复制
HDFS旨在大型集群中的计算机之间可靠地存储非常大的文件,它将每个文件存储为一系列块(即Block),该设计是为了容错,块大小和复制因子是每个文件可配置的。
文件中除最后一个块外的所有块都具有相同的大小,而在添加了对可变长度块的支持后,用户可以在不填充最后一个块的情况下开始新的块,而不用配置的块大小。
应用程序可以指定文件的副本数。复制因子可以在文件创建时指定,以后可以更改。
HDFS中的文件只能写入一次(追加和截断除外),并且在任何时候都只能具有一个写入器,NameNode做出有关块复制的所有决定。它定期从群集中的每个DataNode接收心跳信号和Blockreport。收到心跳信号表示DataNode正常运行。Blockreport包含DataNode上所有块的列表。
- 复本写入位置选择
- 原则:基于机架感知的副本放置策略,目的是提高数据可靠性,可用性和网络带宽利用率
- 其他细节待补充
- 副本读取位置选择
- 为了最大程度地减少全局带宽消耗和读取延迟,HDFS尝试满足最接近读取器的副本的读取请求。如果在与读取器节点相同的机架上存在一个副本,则该副本应优先满足读取请求。如果HDFS群集跨越多个数据中心,则驻留在本地数据中心中的副本比任何远程副本都优先。
- 安全模式
- 启动时,NameNode进入一个特殊的状态,称为安全模式。当NameNode处于安全模式状态时,不会发生数据块的复制。NameNode从数据节点接收心跳和Blockreport消息,Blockreport包含DataNode托管的数据块列表,每个块都有指定的最小副本数,当NameNode对该数据块的最小副本数检查通过时,该块被视为已安全复制。
- 退出:一定比例的数据块检查通过后(再加上30秒),NameNode退出安全模式状态。
- 对于仍少于指定数量的副本的数据块列表,NameNode将这些块复制到其他DataNode。
文件系统元数据的持久性
- NameNode使用物理存储的数据分为操作记录(EditLog)和文件系统元信息(FSImage)。
- EditLog事务日志来永久记录文件系统元数据发生的所有更改
- FsImage用来存储整个文件系统名称空间(包括块到文件的映射和文件系统属性)
- NameNode的内存中,包含整个文件系统命名空间和块-文件映射BlockMap
- DataNode通过BlockReport方式向NameNode上报本地数据块的信息
通讯协议:基于TCP/IP
- client端与NameNode通信使用ClientProtocol
- DataNode端与NameNode通信使用DataNodeProtocol
RPC抽象了以上两个协议,且NN在设计之初便不会主动发起任何的PRC调用,均由其他端主动请求。
可靠性
HDFS的主要目标是即使在出现故障的情况下也能可靠地存储数据。三种常见的故障类型是NameNode故障,DataNode故障和网络分区
-
数据磁盘故障,心跳和重新复制
-
每个DataNode会定期向NameNode发送心跳,缺少心跳时,将认为该DataNode不可用,不会将任何IO请求转发给该节点
-
DataNode的不可用会导致某些块的复制因子降至指定值之下,NameNode需要不断监视这些指标
-
在DataNode不可用,副本损坏,DataNode上的硬盘发生故障的情况下,则需要重新复制
-
-
集群Rebalancing
-
HDFS架构是支持rebalance方案的,如果某个DadeNode的可用空间低于阈值时,会自动将数据转移至另一个DN。
-
-
数据完整性
-
由于存储设备故障,网络故障或软件故障,从DataNode提取的数据块可能会损坏,HDFS客户端会对文件内容执行校验和检查(客户端创建HDFS文件之初,便会计算每个块的校验和,存储在命名空间的隐藏文件中,待获取数据时,便进行校验,若校验失败,将从另一个存储该副本的的DataNode中获取)
-
-
元数据磁盘故障:FsImage和EditLog是HDFS的核心数据结构。这些文件损坏可能导致HDFS实例无法正常运行。
-
解决方法之一:配置NameNode核心数据结构的多副本支持
-
解决方法之二:部署多NameNode,使用NFS共享存储或使用分布式日志编辑(Journal)
-
-
快照,可以回滚至某个历史时间点
总结:HDFS 的特点
高容错
由于 HDFS 采用数据的多副本方案,所以部分硬件的损坏不会导致全部数据的丢失。
高吞吐量
HDFS 设计的重点是支持高吞吐量的数据访问,而不是低延迟的数据访问。
大文件支持
HDFS 适合于大文件的存储,文档的大小应该是是 GB 到 TB 级别的。
简单一致性模型
HDFS 更适合于一次写入多次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。
跨平台移植性
HDFS 具有良好的跨平台移植性,这使得其他大数据计算框架都将其作为数据持久化存储的首选方案。