HDFS源码学习(12)——DataNode主要数据结构
HDFS中DataNode主要负责维护block->stream bytes的映射关系,即实际block数据的存储。 一个datanode的磁盘上存储目录下实际的文件部署结构如下:
data/
├── blocksBeingWritten
├── current
│ ├── VERSION
│ ├── blk_-1148021215131449924
│ ├── blk_-1148021215131449924_1001.meta
│ ├── blk_-8598609183581346893
│ ├── blk_-8598609183581346893_1002.meta
│ ├── blk_6693595845022390257
│ ├── blk_6693595845022390257_1003.meta
│ └── dncp_block_verification.log.curr
├── detach
├── storage
└── tmp
data目录的路径是hdfs-site.xml中配置的dfs.data.dir的路径,表示每个datanode上数据存储的目录
1) blocksBeingWritten:当前正在写入的block,写完之后会将block移至current目录
2) current:当前已经写入的block文件目录
2.1) VERSION为存储的VERSION文件,包括namespaceId,存储Id,存储版本,存储类型,创建时间戳等信息
2.2)blk-*:文件为实际的block数据文件
2.3)blk-*_xxx.meta: block的元信息文件
2.4)dncp_*.log.curr: 当前copy文件
3) detach:copy-on-write使用的目录
4) tmp: 临时目录,DataNode启动时会检查 tmp的数据并删除。
Storage相关
Storage用于描述存储的类型,状态,目录等信息。 其主要结构如下:
StorageInfo
StorageInfo表示一个存储的通用信息,包括:
- layoutVersion: 存储文件中的版本号
- namespaceId: 存储所属的命名空间ID
- ctime: 该存储创建的时间戳
Storage
存储信息的抽象类,管理一个server(NameNode或DataNode)上的存储目录。
Storage有两个关键属性:
- storageType: 表示该存储所属的节点类型(NameNode或是DataNode)
- storageDirs: 该存储上存储目录的列表(ArrayList
),StorageDirectory表示一个存储目录。
####StorageDirectory
表示一个存储目录,有三个属性:
- root:根目录
- lock:当前目录的文件锁
- dirType:目录类型
####StorageSate 表示存储的状态:
- NON_EXISTENT: 目录不存在
- NOT_FORMATTED: 目录未格式化
- COMPLETE_UPGRADE: 升级完成
- RECOVER_UPGRADE: 撤销升级
- COMPLETE_FINALIZE: 提交完成
- COMPLETE_ROLLBACK: 回滚完成
- RECOVER_ROLLBACK: 撤销回滚
- COMPLETE_CHECKPOINT: checkpoint完成
- RECOVER_CHECKPOINT: 撤销checkpoint
- NORMAL: 正常
DataStorage
DataStorage是DataNode上使用的存储类,指定了datanode上各类存储文件的前缀:
- subdir:子目录前缀
- blk_:块文件前缀
- dncp_:拷贝文件前缀
##DatanodeBlockInfo DataNode使用DatanodeBlockInfo管理block和其元数据之间的映射关系,结构如下:
- volmun:block所属的卷
- file:block文件
- detached:是否完成copy-on-write
FSDataSet相关
DataNode通过FSDataSet来完成数据的存储。FSDataset类结构如下:
FSVolume
FSVolumne用于进行block文件所属的卷管理,统计存储目录额使用情况,其中:
- currentDir: 当前数据目录, 对应data/current目录
- dataDir: 数据目录
- tmpDir: 临时目录, 对应data/tmp目录
- dtacheDir: 用于实现写时复制的文件,对应data/detach目录
- usage: 目录使用的空间
- dfsusage: dfs使用的空间
- reseved: 空余空间
- blocksBeingWritten: 正在写入的block,对应data/blocksBeingWritten目录
FSVolumeSet
FSVolumeSet是FSVolume的集合,提供了所有容量,剩余空间等方法。其中getNextVolume中提供了round-robin策略选取下一个volume,从而实现简单的IO负载均衡,提高IO处理能力。
FSDataSet
FSDataSet是在FSVolumeSet之上进行封装实现FSDatasetInterface借口,向外提供块查询和操作方法。
其中有几个主要属性:
- volumes: 卷集合(FSVolumeSet)
- ongoingCreates: 当前活动的文件
- maxBlocksPerDir: 每个目录下最多能存放发block数,可通过dfs.datanode.numblocks配置
- volumeMap:块与块文件的映射信息(HashMap<Block, DatanodeBlockInfo>),当前集合中所有的块信息均维护在该map中
FSDir
用于构建block块在datanode磁盘上的层次结构,默认情况下每个目录下最多64个子目录,最多能存储64个块。目录初始化时会递归扫描目录下的所有子目录和文件,构建一个树形结构。
addBlock时,首先尝试在当前目录新加块,如果当前目录没有空闲空间,则尝试在子目录中添加,如果没有子目录,则新建一个子目录。
BlockAndFile
Block与其文件名的封装
ActiveFile
表示一个当前活动中的文件
blog comments powered by Disqus