Hadoop-组件-HDFS-理论笔记-HDFS 架构设计-DataNode 架构-数据层设计
一、概述
DataNode 最重要的功能就是管理磁盘上存储的数据块
二、架构设计
2.1. 内存
HDFS支持由 DataNode 管理的写入到堆栈内存的功能。DataNode 会异步的将数据从内存持久化至磁盘,从而在性能敏感的 IO Path 中移去品贵的磁盘 I/O 和校验,因此我们称之为Lazy Persist。
HDFS 尽可能的保证在 LazyPersist策略下的持久性。在副本还未持久化至磁盘,节点重启了,则有可能会发生罕见的数据遗失。我们可以选
择 Lazy Persist Writes 的策略来减少延迟,但可能会损失一定的持久性。
https://www.imooc.com/article/270157
https://betheme.net/news/txtlist_i27933v.html?action=onClick
2.2. 磁盘
Datanode 最重要的功能就是管理磁盘上存储的 HDFS 数据块。Datanode 将这个管理功能切分为两个部分
- 管理与组织磁盘存储目录(由 dfs.data.dir 指定),如 current、 previous、detach、 tmp 等,这个功能由 DataStorage 类实现
- 管理与组织数据块及其元数据文件,这个功能主要由 FsDatasetImpl 相关类实现。
因为 NameNode 也会用到 Storage 相关,而 NameNode 并不存储数据块块文件,因而将存储分成这两部分。
2.2.1. 磁盘存储目录管理
Datanode 可以定义多个存储目录保存数据块,如下配置所示,Datanode 定义了 /dfs/data 和 /dfs/data2 两个数据存储目录,这两个存储目录共同组成了 Datanode 的存储空间,Datanode 的多个存储目录存储的数据块并不相同。并且不同的存储目录可以是异构的,可以提高数据块 I/O 的吞吐率。
1 | <property> |
/data/hdfs/dfs/data,/data/hdfs/dfs/data2 两个目录下存储的就是本 DataNode 所能管理的所有数据。
进入其中一个目录,可能的目录结构是这样:
https://blog.csdn.net/cn987654/article/details/121732481
相关类
Storage
一个 Storage 可以定义多个存储目录,存储目录由 Storage 的内部类 StorageDirectory 描述,StorageDirectory 类定义了存储目录上的通用操作。
以 Datanode 的配置为例,Datanode 可以定义多个存储目录保存数据块,如下配置所示,Datanode 定义了两个数据存储目录,即
/data/hdfs/dfs/data 和 /data/hdfs/dfs/data2。HDFS 会使用一个 DataStorage 对象管理整个 Datanode 的存储,而这两个存储目录则由两个 StorageDirectory 对象管理。StorageDirectory
StorageDirectory 对应的为每个本地存储路径,如: /data/hdfs/dfs/data, DataStorage 对所有的本地存储路径进行统一管理,也就是对 StorageDirectory 运行管理,并没有对存储路经中的具体数据文件进行管理。
StorageState
StorageState 枚举类完整地定义了存储空间可能出现的所有状态。
1
2
3
4
5
6
7
8
9
10
11
12public enum StorageState {
NON_EXISTENT,//存储不存在
NOT_FORMATTED,//未格式化
COMPLETE_UPGRADE,//升级完成编译
RECOVER_UPGRADE,//恢复升级状态
COMPLETE_FINALIZE,//完成升级提交
COMPLETE_ROLLBACK,//完成回滚
RECOVER_ROLLBACK,//回复回滚
COMPLETE_CHECKPOINT,//完成检查点操作
RECOVER_CHECKPOINT,//回复检查点操作
NORMAL;//正常状态
}在升级、回滚、升级提交、检查点等操作中,节点的存储空间可能出现各种异常,例如误操作、断电、宕机等情况,这个时候存储空间就可能处于某种中间状态,引入中间状态,有利于 HDFS 从错误中恢复过来。
2.2.3. 数据块及其元数据文件管理
Datanode 中,每一个 Block 对应一个数据存储文件,数据存储文件以 blk_ 开头;同时,每一个 Block 还对应一个元数据文件,元数据文件以 .meta 结尾
FSDir 对应的是 current 目录及其子目录,存放数据块及其元数据文件,在初始化一个目录时,会递归扫描该目录下的目录和文件,从而形成一个树状结构。
BlockPoolSlice:管理一个指定块池在一个指定存储目录下的所有数据块。由于 Datanode 可以定义多个存储目录:所以块池的数据块会分布在多个存储目永下。
个块池会拥有多个 BlockPooislice 对象,这个块池对应的所有 BlockPoolslice 对象共
同管理块池的所有数据块。