Datanode 整体从逻辑上可以切分为服务层、逻辑层以及数据层三个模块。

一、数据层

Datanode 的所有服务都是建立在数据块存储功能基础上的,将 Datanode 中数据块的部分抽象为数据层。数据层包括两个主要的模块。

2.1. DataStorage 数据存储

DataStorage 数据层负责管理数据节点的存储空间,并管理在云仿真平台上更 新名称。在云平台联邦机制中,数据节点可以存储来自多个块池的数据块,并 且文件系统通过 BlockPoolSliceStorage 管理数据节点上单个块池的空间。 DataStorage 包含对所有 BlockPoolSliceStorage 对象的引用,并使用这些引用 来管理数据节点上的所有块池。

2.2. FsDataset 文件系统数据集

FsDataset 抽象化 Datanode 中数据块的管理。 Datanode 可以配置有不同类型 的存储目录来存储数据块。 云仿真平台文件系统通过 FSVolumeImpl 类管理 存储在数据节点上单个存储目录中的所有数据块。

二、逻辑层

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

2.1. BlockPoolManager

BlockPoolManager 管理数据集群中所有块池。一个 BlockPoolManager 对象包含 BPOfferService 对象的多个实例,每个 BPOfferService 对象管理该数据节点的块池。 在 HA 机制中,每个名称空间中包含 两个 NameNode。 为 Active NameNode 和 StandBy NameNode。 因此, 每个 BPOfferService 对象都包含两个 BPServiceActor 对象,负责将心跳,块报告,缓存报告和增量块报告发送到 NameNode。

2.2. DataBlockScanner

DataBlockScanner 独立线程定期扫描每个数据块,并检查数据块的校验和checksums是否正常。

2.3. DirectoryScanner

DirectoryScanner 线程定期启动对数据块的扫描,比较内存中的元 数据与数据块之间的差异,然后更新 NameNode 内存中的元数据以使其与 平台上存储的数据块信息一致。

三、服务层

Datanode 中包含一个外部服务层。服务层中的模块用于帮助其他节点与 Datanode 通信以及访问 Datanode 状态。服务层主要包括三个模块。 Http Server,向外界提供 HTTP 服务,可用于获取 Datanode 的内部状态。

  1. HttpServer 响应来自于 Client,Namenode 以及其他 Datanode 的 RPC 请求。

  2. IPCServer 响应来自于 Client 以及其他 Datanode 的流式接口请求。

  3. DataXceiverServer 通信服务器响应来自客户端和其他数据节点的流接口请求。