Hadoop3.2.1 【 HDFS 】源码分析 : Datanode 概述

一.概述

Datanode以存储数据块(Block) 的形式保存HDFS文件, 同时Datanode还会响应HDFS客户端读、 写数据块的请求。 Datanode会周期性地向Namenode上报心跳信息、 数据块汇报信息(BlockReport) 、 缓存数据块汇报信息(CacheReport) 以及增量数据块块汇报信息。 Namenode会根据块汇报的内容, 修改Namenode的命名空间(Namespace) , 同时向Datanode返回名字节点指令。 Datanode会响应
Namenode返回的名字节点指令, 如创建、 删除和复制数据块指令等。

二.Datanode逻辑结构

在这里插入图片描述

2.1 数据层

Datanode的所有服务都是建立在数据块存储功能基础上的, 我们将Datanode中负责在本地磁盘存储数据块的部分抽象为数据层。

  • DataStorage——数据存储: 负责管理与组织Datanode的磁盘存储空间, 同时也负责管理存储空间的生命周期(包括升级、 回滚、 提交等操作) 。 在HDFSFederation架构中, 一个Datanode可以保存多个块池的数据块, HDFS定义了BlockPoolSliceStorage类管理Datanode上单个块池的存储空间。DataStorage类会持有所有BlockPoolSliceStorage对象的引用, 并通过这些引用管理Datanode上的所有块池。

  • FsDataset——文件系统数据集: 抽象了Datanode管理数据块的所有操作, 例如创建数据块文件、 维护数据块文件和校验和文件的对应关系等。 每个Datanode都可以配置若干个不同类型的存储目录来保存数据块(通过配置项dfs.datanode.data.dir配置) , 所以HDFS定义了FSVolumelmpl类来管理Datanode上单个存储目录保存的所有数据块, 同时定义了FSVolumeList类来维护Datanode上所有FSVolumelmpl对象的引用。 FsDataset会通过FSVolumeList类提供的功能管理Datanode上所有存储目录保存的数据块。

2.2 逻辑层

在数据层的基础上, Datanode会执行若干HDFS逻辑, 例如向Namenode汇报数据块存储状态、 发送心跳、 扫描损坏的数据块等, 我们将Datanode上负责执行HDFS逻辑的部分抽象为逻辑层。 逻辑层包括三个主要的模块。

  • BlockPoolManager: 管理所有块池的接口类。 HDFS提供了Federation机制, 也就是每个HDFS集群都可以配置多个命名空间, 每个命名空间在Datanode上都有一个与之对应的块池。 一个BlockPoolManager对象会持有多个BPOfferService对象的实例, 每个BPOfferService对象都管理这个Datanode的一个块池。 HDFS除了引入Federation机制外, 还引入了HA机制, 每个命名空间都可以定义两个Namenode, 一个作为Active Namenode, 一个作为Standby Namenode。 所以每个BPOfferService对象又都会持有两个BPServiceActor对象, 一个BPServiceActor对象对应于命名空间中的一个Namenode, 该对象负责向这个Namenode发送心跳、 块汇报、 缓存汇报以及增量块汇报, 并执行Namenode返回的名字节点指令(DatanodeCommand).

  • DataBlockScanner: 一个独立的线程, 周期性地扫描每个数据块并检查数据块的校验和是否正常。

  • DirectoryScanner: 一个独立的线程, 定时发起对磁盘数据块的扫描, 对比内存中元数据与实际磁盘存储数据块的差异, 然后更新内存中的元数据, 使之与磁盘保存的数据块信息一致。

2.3 服务层

服务层:服务层中的模块用于支持其他节点与Datanode通信, 以及访问Datanode状态等功能。

HttpServer: 对外提供HTTP服务, 可用于展示Datanode内部状态。
IPCServer: RPC服务端, 响应来自于Client、 Namenode以及其他Datanode的RPC请求。
DataXceiverServer: 数据传输服务端, 响应来自于Client以及其他Datanode的流式接口请求