Hadoop 系列(一)—— 分布式文件系统 HDFS

1、介绍

HDFSHadoop Distributed File System)是 Hadoop 下的分布式文件系统,具备高容错、高吞吐量等特性,能够部署在低成本的硬件上。html

2、HDFS 设计原理

https://github.com/heibaiying

2.1 HDFS 架构

HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:node

  • NameNode : 负责执行有关 文件系统命名空间 的操做,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。
  • DataNode:负责提供来自文件系统客户端的读写请求,执行块的建立,删除等操做。

2.2 文件系统命名空间

HDFS 的 文件系统命名空间 的层次结构与大多数文件系统相似 (如 Linux), 支持目录和文件的建立、移动、删除和重命名等操做,支持配置用户和访问权限,但不支持硬连接和软链接。NameNode 负责维护文件系统名称空间,记录对名称空间或其属性的任何更改。git

2.3 数据复制

因为 Hadoop 被设计运行在廉价的机器上,这意味着硬件是不可靠的,为了保证容错性,HDFS 提供了数据复制机制。HDFS 将每个文件存储为一系列,每一个块由多个副原本保证容错,块的大小和复制因子能够自行配置(默认状况下,块大小是 128M,默认复制因子是 3)。github

https://github.com/heibaiying

2.4 数据复制的实现原理

大型的 HDFS 实例在一般分布在多个机架的多台服务器上,不一样机架上的两台服务器之间经过交换机进行通信。在大多数状况下,同一机架中的服务器间的网络带宽大于不一样机架中的服务器之间的带宽。所以 HDFS 采用机架感知副本放置策略,对于常见状况,当复制因子为 3 时,HDFS 的放置策略是:apache

在写入程序位于 datanode 上时,就优先将写入文件的一个副本放置在该 datanode 上,不然放在随机 datanode 上。以后在另外一个远程机架上的任意一个节点上放置另外一个副本,并在该机架上的另外一个节点上放置最后一个副本。此策略能够减小机架间的写入流量,从而提升写入性能。服务器

<div align="center"> <img src="https://raw.githubusercontent...;/> </div>
若是复制因子大于 3,则随机肯定第 4 个和以后副本的放置位置,同时保持每一个机架的副本数量低于上限,上限值一般为 (复制系数 - 1)/机架数量 + 2,须要注意的是不容许同一个 dataNode 上具备同一个块的多个副本。网络

2.5 副本的选择

为了最大限度地减小带宽消耗和读取延迟,HDFS 在执行读取请求时,优先读取距离读取器最近的副本。若是在与读取器节点相同的机架上存在副本,则优先选择该副本。若是 HDFS 群集跨越多个数据中心,则优先选择本地数据中心上的副本。架构

2.6 架构的稳定性

1. 心跳机制和从新复制

每一个 DataNode 按期向 NameNode 发送心跳消息,若是超过指定时间没有收到心跳消息,则将 DataNode 标记为死亡。NameNode 不会将任何新的 IO 请求转发给标记为死亡的 DataNode,也不会再使用这些 DataNode 上的数据。 因为数据再也不可用,可能会致使某些块的复制因子小于其指定值,NameNode 会跟踪这些块,并在必要的时候进行从新复制。框架

2. 数据的完整性

因为存储设备故障等缘由,存储在 DataNode 上的数据块也会发生损坏。为了不读取到已经损坏的数据而致使错误,HDFS 提供了数据完整性校验机制来保证数据的完整性,具体操做以下:分布式

当客户端建立 HDFS 文件时,它会计算文件的每一个块的 校验和 ,并将 校验和 存储在同一 HDFS 命名空间下的单独的隐藏文件中。当客户端检索文件内容时,它会验证从每一个 DataNode 接收的数据是否与存储在关联校验和文件中的 校验和 匹配。若是匹配失败,则证实数据已经损坏,此时客户端会选择从其余 DataNode 获取该块的其余可用副本。

3.元数据的磁盘故障

FsImageEditLog 是 HDFS 的核心数据,这些数据的意外丢失可能会致使整个 HDFS 服务不可用。为了不这个问题,能够配置 NameNode 使其支持 FsImageEditLog 多副本同步,这样 FsImageEditLog 的任何改变都会引发每一个副本 FsImageEditLog 的同步更新。

4.支持快照

快照支持在特定时刻存储数据副本,在数据意外损坏时,能够经过回滚操做恢复到健康的数据状态。

3、HDFS 的特色

3.1 高容错

因为 HDFS 采用数据的多副本方案,因此部分硬件的损坏不会致使所有数据的丢失。

3.2 高吞吐量

HDFS 设计的重点是支持高吞吐量的数据访问,而不是低延迟的数据访问。

3.3 大文件支持

HDFS 适合于大文件的存储,文档的大小应该是是 GB 到 TB 级别的。

3.3 简单一致性模型

HDFS 更适合于一次写入屡次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。

3.4 跨平台移植性

HDFS 具备良好的跨平台移植性,这使得其余大数据计算框架都将其做为数据持久化存储的首选方案。

附:图解HDFS存储原理

说明:如下图片引用自博客: 翻译经典 HDFS 原理讲解漫画

1. HDFS写数据原理

https://github.com/heibaiying

https://github.com/heibaiying

https://github.com/heibaiying

2. HDFS读数据原理

https://github.com/heibaiying

3. HDFS故障类型和其检测方法

https://github.com/heibaiying

https://github.com/heibaiying

第二部分:读写故障的处理

https://github.com/heibaiying

第三部分:DataNode 故障处理

https://github.com/heibaiying

副本布局策略

https://github.com/heibaiying

参考资料

  1. Apache Hadoop 2.9.2 > HDFS Architecture
  2. Tom White . hadoop 权威指南 [M] . 清华大学出版社 . 2017.
  3. 翻译经典 HDFS 原理讲解漫画
更多大数据系列文章能够参见 GitHub 开源项目大数据入门指南
相关文章
相关标签/搜索