BigData-Notes/notes/Hadoop-HDFS.md
2019-05-31 16:15:21 +08:00

177 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Hadoop分布式文件系统——HDFS
<nav>
<a href="#一介绍">一、介绍</a><br/>
<a href="#二HDFS-设计原理">二、HDFS 设计原理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-HDFS-架构">2.1 HDFS 架构</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-文件系统命名空间">2.2 文件系统命名空间</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-数据复制">2.3 数据复制</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-数据复制的实现原理">2.4 数据复制的实现原理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#25--副本的选择">2.5 副本的选择</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#26-架构的稳定性">2.6 架构的稳定性</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-心跳机制和重新复制">1. 心跳机制和重新复制</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-数据的完整性">2. 数据的完整性</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#3元数据的磁盘故障">3.元数据的磁盘故障</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#4支持快照">4.支持快照</a><br/>
<a href="#三HDFS-的特点">三、HDFS 的特点</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-高容错">3.1 高容错</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-高吞吐量">3.2 高吞吐量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33--大文件支持">3.3 大文件支持</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-简单一致性模型">3.3 简单一致性模型</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-跨平台移植性">3.4 跨平台移植性</a><br/>
<a href="#附图解HDFS存储原理">图解HDFS存储原理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#1-HDFS写数据原理">1. HDFS写数据原理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#2-HDFS读数据原理">2. HDFS读数据原理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#3-HDFS故障类型和其检测方法">3. HDFS故障类型和其检测方法</a><br/>
</nav>
## 一、介绍
**HDFS** **Hadoop Distributed File System**是Hadoop下的分布式文件系统具有高容错、高吞吐量等特性可以部署在低成本的硬件上。
## 二、HDFS 设计原理
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfsarchitecture.png"/> </div>
### 2.1 HDFS 架构
HDFS 遵循主/从架构由单个NameNode(NN)和多个DataNode(DN)组成:
- **NameNode** : 负责执行有关`文件系统命名空间`的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。
- **DataNode**:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。
### 2.2 文件系统命名空间
HDFS的`文件系统命名空间`的层次结构与大多数文件系统类似(如Linux) 支持目录和文件的创建、移动、删除和重命名等操作,支持配置用户和访问权限,但不支持硬链接和软连接。`NameNode`负责维护文件系统名称空间,记录对名称空间或其属性的任何更改。
### 2.3 数据复制
由于Hadoop被设计运行在廉价的机器上这意味着硬件是不可靠的为了保证容错性HDFS提供了数据复制机制。HDFS 将每一个文件存储为一系列**块**每个块由多个副本来保证容错块的大小和复制因子可以自行配置默认情况下块大小是128M默认复制因子是3
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfsdatanodes.png"/> </div>
### 2.4 数据复制的实现原理
大型的HDFS实例在通常分布在多个机架的多台服务器上不同机架上的两台服务器之间通过交换机进行通讯。在大多数情况下同一机架中的服务器间的网络带宽大于不同机架中的服务器之间的带宽。因此HDFS采用机架感知副本放置策略对于常见情况当复制因子为3时HDFS的放置策略是
在写入程序位于`datanode`上时,就优先将写入文件的一个副本放置在该`datanode`上,否则放在随机`datanode`上。之后在另一个远程机架上的任意一个节点上放置另一个副本,并在该机架上的另一个节点上放置最后一个副本。此策略可以减少机架间的写入流量,从而提高写入性能。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-机架.png"/> </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.元数据的磁盘故障
`FsImage``EditLog`是HDFS的核心数据这些数据的意外丢失可能会导致整个HDFS服务不可用。为了避免这个问题可以配置NameNode使其支持`FsImage``EditLog`多副本同步,这样`FsImage``EditLog`的任何改变都会引起每个副本`FsImage``EditLog`的同步更新。
#### 4.支持快照
快照支持在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态。
## 三、HDFS 的特点
### 3.1 高容错
由于HDFS 采用数据的多副本方案,所以部分硬件的损坏不会导致全部数据的丢失。
### 3.2 高吞吐量
HDFS设计的重点是支持高吞吐量的数据访问而不是低延迟的数据访问。
### 3.3 大文件支持
HDFS适合于大文件的存储文档的大小应该是是GB到TB级别的。
### 3.3 简单一致性模型
HDFS更适合于一次写入多次读取(write-once-read-many)的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。
### 3.4 跨平台移植性
HDFS具有良好的跨平台移植性这使得其他大数据计算框架都将其作为数据持久化存储的首选方案。
## 附图解HDFS存储原理
> 说明:以下图片引用自博客:[翻译经典 HDFS 原理讲解漫画](https://blog.csdn.net/hudiefenmu/article/details/37655491)
### 1. HDFS写数据原理
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-write-1.jpg"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-write-2.jpg"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-write-3.jpg"/> </div>
### 2. HDFS读数据原理
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-read-1.jpg"/> </div>
### 3. HDFS故障类型和其检测方法
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-tolerance-1.jpg"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-tolerance-2.jpg"/> </div>
**第二部分:读写故障的处理**
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-tolerance-3.jpg"/> </div>
**第三部分DataNode故障处理**
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-tolerance-4.jpg"/> </div>
**副本布局策略**
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hdfs-tolerance-5.jpg"/> </div>
## 参考资料
1. [Apache Hadoop 2.9.2 > HDFS Architecture](http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)
2. Tom White . hadoop权威指南 [M] . 清华大学出版社 . 2017.
3. [翻译经典 HDFS 原理讲解漫画](https://blog.csdn.net/hudiefenmu/article/details/37655491)