HDFS2.x DataNode学习笔记
DataNode作用
- 块存储
- 客户端读写
- 向NN上报心跳信息,数据块汇报信息,缓存数据信息,增量数据块信息
- 响应NN指令,比如创建,删除,复制等(NN收集信息,通过心跳向DN返回指令)
DataNode概念
- 块池(BlockPool)
同一个命名空间的所有数据块 - 命名空间卷(NamespaceVolume)
一个NN管理的块池和Namespace一起被称为命名空间卷。它是升级的独立单位。
目的可能是为了分离Namespace的功能,和块管理的功能。通过管理块池进行块管理。
DataNode逻辑结构
根据功能划分结构
块存储和块操作有两个模块
DataStorage
- 数据存储
通过StoreageDirectory对象,来管理多个存储目录。
通过持有所有BlockPoolSliceStorage引用,来管理多个池块数据。 - 存储空间的生命周期
升级,回滚,提交等操作
一个Datanode可以有多个池
FsDataset
文件系统数据集
- 管理数据块
创建数据块,维护数据块和校验和文件的对应关系 - FSVolumeImpl
管理单个存储目录的所有数据块,FSVolumeList维护所有FSVolumeImpl的引用。
心跳功能,收集信息功能,执行NN命令功能
DataBlockScanner
独立线程,周期扫描没有数据块检查数据块校验和
DirectoryScanner
独立线程,定时磁盘数据块扫描,对比元数据和实际存储,更新内存中元数据
BlockPoolManager
- 管理多个池块的接口类
通过持有多个BPOfferService对象,管理多个池块接口 - 管理不同池块的心跳,块汇报,缓存汇报,对象块汇报
BPOffserService中包含多个BPServiceActor对象,对应多个NameNode,BPServiceActor来汇报和执行命令。
HttpServer
提供HTTP服务,展示DataNode内部状态
IPCServer
提供RPC服务,响应Client,Namenode以及其他Datanode的RPC请求
DataXceiverServer
数据传输服务端,响应Client以及其他DataNode的流式接口请求。
DataNode存储
DataNode磁盘存储结构
DataNode需要保存自身的元数据,这些元数据是通过DN磁盘存储的一些文件和目录保存的。
- datanode可以配置多个目录
这些目录可以是异构的,增加吞吐 - 版本
每个目录结构下,紧跟的是版本目录,用来回退升级等 - 池块(blockpool)
一个datanode目录下包含多个池块目录 - 池块版本
为了支持单个NS单独升级,每一个池块里也要包含版本目录(current,previous等),进行升级解耦
实际的目录结构如下:
磁盘存储文件说明:
- BP-随机池块ID-NN地址-时间
- VERSION
包含:
layout文件
clusterId,ctime.
storageType: 存储类型
blockpoolId: 和目录池块ID一致 - finialized/rbw
存储数据块和校验和 - lazyPersist
临时将内存的数据持久化到磁盘 - dncp_block_verification.log
最近一次确认数据块内容和校验值匹配的时间, - in_use.lock
Datanode线程持有的锁文件,防止多个Datanode线程修改这个目录。