一、概述

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 将这个管理功能切分为两个部分

  1. 管理与组织磁盘存储目录(由 dfs.data.dir 指定),如 current、 previous、detach、 tmp 等,这个功能由 DataStorage 类实现
  2. 管理与组织数据块及其元数据文件,这个功能主要由 FsDatasetImpl 相关类实现。

因为 NameNode 也会用到 Storage 相关,而 NameNode 并不存储数据块块文件,因而将存储分成这两部分。

2.2.1. 磁盘存储目录管理

Datanode 可以定义多个存储目录保存数据块,如下配置所示,Datanode 定义了 /dfs/data/dfs/data2 两个数据存储目录,这两个存储目录共同组成了 Datanode 的存储空间,Datanode 的多个存储目录存储的数据块并不相同。并且不同的存储目录可以是异构的,可以提高数据块 I/O 的吞吐率。

1
2
3
4
<property>
<name>dfs.data.dirs</name>
<value>/data/hdfs/dfs/data,/data/hdfs/dfs/data2</value>
</property>

/data/hdfs/dfs/data/data/hdfs/dfs/data2 两个目录下存储的就是本 DataNode 所能管理的所有数据。

进入其中一个目录,可能的目录结构是这样:

https://blog.csdn.net/cn987654/article/details/121732481

  1. 相关类

    • Storage

      一个 Storage 可以定义多个存储目录,存储目录由 Storage 的内部类 StorageDirectory 描述,StorageDirectory 类定义了存储目录上的通用操作。

      Storage

      以 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
        12
        public 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 结尾

FSDataset

FSDir 对应的是 current 目录及其子目录,存放数据块及其元数据文件,在初始化一个目录时,会递归扫描该目录下的目录和文件,从而形成一个树状结构。
BlockPoolSlice:管理一个指定块池在一个指定存储目录下的所有数据块。由于 Datanode 可以定义多个存储目录:所以块池的数据块会分布在多个存储目永下。
个块池会拥有多个 BlockPooislice 对象,这个块池对应的所有 BlockPoolslice 对象共
同管理块池的所有数据块。