文章链接
HDFS 概述
Hadoop 分布式文件系统( HDFS )是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。 HDFS 是一个高度容错性的系统,适合部署在廉价的机器上。 HDFS 能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。 HDFS 放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。 HDFS 在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。 HDFS 是Apache Hadoop Core项目的一部分。
HDFS 有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS 放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。
HDFS 的优点
- 高容错性
- 数据保存多个副本
- 数据丢的失后自动恢复
- 适合批处理
- 移动计算而非移动数据
- 数据位置暴露给计算框架
- 适合大数据处理
- GB、TB、甚至 PB 级的数据处理
- 百万规模以上的文件数据
- 10000+ 的节点
- 可构建在廉价的机器上
- 通过多副本存储,提高可靠性
- 提供了容错和恢复机制
HDFS 的缺点
- 低延迟数据访问处理较弱
- 毫秒级别的访问响应较慢
- 低延迟和高吞吐率的请求处理较弱
- 大量小文件存取处理较弱
- 会占用大量NameNode的内存
- 寻道时间超过读取时间
- 不支持并发写入、文件随机修改
- 一个文件仅有一个写者
- 仅支持Append写入
HDFS 节点

Hadoop 是建立在(master – slave)关系上 , HDFS 同样有 2 种类型的节点 ,集群中包含NameNode 和 DataNode。
- HDFS Master ( NameNode )
NameNode 负责调度客户端的访问,管理从属节点以及将任务指派给它们,NameNode 执行文件系统的 Namespace 操作, 例如:打开、关闭、重命名文件和目录。NameNode 应当部署在相对可靠的硬件环境中。
- HDFS Slave (DataNode)
DataNode 数据节点在 Hadoop 分布式文件系统里管理存储的数据,Slave (数量 1 ~ 1000)执行节点到节点间的任务和服务的读写请求,还执行来自于NameNode 节点的建立、删除、复制指令,一旦一个块(block)被写入DataNode , 将复制至其他 DataNode 并且继续执行,直到所配置副本的数量。DataNode 节点可以部署在廉价的硬件上,并且不需要非常可靠的硬件环境。
HDFS 进程
HDFS 的进程运行在以下节点上 :
- NameNode: 运行在所有的 Master 上,用来存放元数据,如文件名存储、块的数量、副本的数量、位置块、块 ID 等,为了使用的可持续性,本地磁盘中还存放元数据副本,这种元数据放在内存中可更快速地检索数据,所以 NameNode 机器应该配置较高的内存。
- DataNode:运行在所有的 DataNode 上,这些是存储数据的实际工作节点。
HDFS 数据存储
当任何文件被写入到 HDFS 中时,将被分成小块 ,称为块数据,默认块的大小为 128 MB,可以根据要求增加。这些块以分布式方式存储在集群的不同节点上,这为 Mapreduce 提供了一种在群集中并行处理数据的机制。每个块的多个副本存储在不同节点上的群集中。这就是数据的复制,默认情况下,HDFS 复制数量为 3。它提供容错、可靠性和高可用性,大文件被拆分为 n 个小块,这些块以分布式方式存储在群集中的不同节点上,每个块都被复制并存储在群集中的不同节点上。

1、文件被切割成固大小的数据块
- hadoop 1.x 上默认数据块大小是 64 MB,数据块大小可配置。在hadoop 2.x上默认是128M
- 若数据块大小不到默认数据块大小,则单独成一个数据块。
2、block大小配置
如果进行数据块的自定义需要修改hdfs-site.xml文件,例如:
<property>
<name>dfs.blocksize</name>
<value>100m</value>
</property>
<property>
<name>dfs.namenode.fs-limits.min-block-size</name>
<value>100m</value>
</property>
此时表示 HDFS 每个数据的大小为100MB。注意,在修改HDFS的数据块大小时,先停掉集群Hadoop 的运行进程,修改完毕后重新启动。
3、一个文件存储方式
- 按大小切割成若干个 block,存储在不同的节点上
- 每个 block 默认存三个副本
- Block 大小和副本数由 Client 上传文件的时候设置。文件上传成功以后,副本数可以变更, 但是 Block 大小不可变。 dfs.blocksize 100m dfs.namenode.fs-limits.min-block-size 100m
4、HDFS 的 Block 块大小为什么是128MB
Block 块的大小主要取决于磁盘传输速率,一般 hdfs 的寻址时间为 10ms 左右。当寻址时间为传输时间的 1%时为最佳状态,因此传输时间大概在 1s 左右。机械硬盘文件顺序读写的速度为100 MB/s,普通固态为500MB/s,PCIe 固态的速度可以达到 2000 MB/s,因此块的大小可以分别设为 128 MB、512 MB、2048 MB。
HDFS 体系结构
Hadoop 分布式文件系统结构见下图,有一个 NameNode, 且有多个 DataNode 执行存储工作。节点排列在集群中,数据块的副本存储在集群中不同的机器上,以提供容错机制。本文的其余章节里,我们将看到如何在 HDFS 中执行读取和写入操作,要在 HDFS 中读取或写入文件,客户端需要与NameNode 进行交互,建立文件的 write-once-read-many 模型。

NameNode 存储元数据,DataNode 存储实际数据。集群环境中,客户端使用 NameNode 执行交互任务。集群中的一些 DataNode 节点将 HDFS 数据存储在本地磁盘中,DataNode 定期向NameNode 发送心跳消息以指示它处于活动状态,并且根据复制数量(默认值3),复制数据到其他数据节点。
NameNode
HDFS 体系结构中的 NameNode 称为主节点,存储元数据,即数据块、副本和其他详细信息的数量和描述。此元数据存储在 Master 的内存中,以便更快地检索数据。NameNode 维护和管理 Slave 数据节点,并将任务分配给它们。它是 HDFS 的核心,因此应该部署在相对可靠的硬件上。
核心任务
- 管理文件系统的命名空间
- 规范客户端对文件的访问
- 操作文件系统,例如命名、关闭、打开文件/目录
- 接收 Hadoop 集群中的心跳消息和 block(块)报告,确保数据节点是活动的,block 报告包含数据节点上所有块的列表信息
- 处理所有 block 的复制数量
镜像文件
FsImage 包含整个文件系统名称空间,作为文件存储在 NameNode 的本地文件系统中,还包含文件系统中所有目录和索引的序列化形式,每个索引都是文件或目录元数据的内部表示。
编辑日志
EditLogs 包含对 Fsimage 上的文件系统所做的所有最新修改,如:NameNode 从客户端接收创建、更新、删除请求,之后这个请求被记录到编辑日志中。
DataNode
DataNode 也称为 Slave,在 Hadoop HDFS 体系结构中,DataNode 将实际数据存储在 HDFS中,它根据客户机的请求执行 IO 操作,可以部署在较廉价的硬上。
核心任务
根据NameNode的指令,进行block副本的创建、删除和复制
管理系统内的数据存储
向 NameNode 发送心跳消息以报告 HDFS 的运行状况,默认情况下,此频率设置为3秒。
Secondary NameNode
Secondary NameNode 称为辅助节点,它并不是 NameNode 节点的备份。当 NameNode 启动时,从(Fsimage)镜像文件读取HDFS的状态信息,修改 Editlogs(编辑日志)文件,之后将编辑日志合并更新到镜像文件中,最后使用新的空编辑文件开始正常操作。生产环境中 NameNode 很少重新启动,随着使用时间的推移,编辑日志会越来越大,Secondary NameNode作用是帮助我们减小编辑日志,更新合并编辑日志到镜像文件中。

Checkpoint Node
Checkpoint Node 称为检查节点,是定期创建命名空间检查点的节点。
检查节点首先下载镜像文件,并从活动的 NameNode 进行编辑,然后在本地合并它们(镜像文件和编辑日志),最后将新的镜像文件上传到活动的 NameNode。最新的检查点存储在与 NameNode目录结构相同的目录中,允许检查点的镜像在必要时始终可供 NameNode 读取。
Backup Node
Backup Node 称为备份节点,提供与检查点节点相同的检查点功能,NameNode 支持一个备份节点。
备份节点保留内存中文件系统命名空间的最新副本,它始终与活动的 NameNode状态同步,与检查点不同,它不需要下载镜像文件和编辑日志,在内存中已拥有命名空间的最新状态,执行效率更高,只需要将命名空间保存到本地镜像文件中并重新编辑。
Replication Management
Replication Management 称为副本管理。
如果一个副本不可访问且已损坏,我们可以从另一个副本读取数据。HDFS 体系结构中每个文件块默认的复制数量是 3,这也是可配置的。因此,每个块复制三次并存储在不同的数据节点上。
如果我们使用默认配置在 HDFS 中存储 128 MB 的文件,我们将占用 384 MB(3 * 128 MB)的空间。
NameNode 定期从 DataNode 接收块的消息报告以维护复制数量,当块复制数量过度或不足时,根据需要添加或删除 NameNode 的副本。
Rack Awareness
Rack Awareness 称为机架感知。
Hadoop 在一组计算机上运行,这些计算机通常分布在许多机架上,NameNode 将块的副本放置在多个机架上, 以提高容错能力。NameNode 尝试在每个机架中至少放置一个块的副本,目的是提高数据可靠性和网络带宽利用率,以便在整个机架出现故障后,系统也将具有高度可用性。
Hadoop 集群中,为了提高 HDFS 文件读写时的网络流量,NameNode 选择靠近同一机架或附近机架的DataNode 进行读写请求,NameNode 通过维护每个数据节点的机架 ID 来获取机架信息,机架感知是基于机架信息选择数据节点。
NameNode确保所有副本都不存储在同一个机架或单个机架上,它遵循机架感知算法来减少延迟和容错,我们知道默认的复制数量是 3,根据机架感知算法,块的第一个副本将存储在本地机架上,下一个副本将在同一机架中存储另一个数据节点,第三个副本将存储在不同机架上。
机架用于提高:
- 数据高可用性和可靠性
- 集群的性能
- 网络带宽