HDFS元数据
HDFS元数据用树形结构保存了hdfs目录和文件结构,同时保存权限/所有者/容量/副本等信息。不要去修改hdfs元数据目录和文件否则会造成数据丢失。
持久化hdfs元数据主要有两类数据
- fsimage 保存整个文件系统在某个时间点的完整状态,简单理解为元数据内存结构的持久化文件。所有的文件系统改动都会分配一个自增的事务ID,fsimage代表文件系统在截止到某个事务ID所有改动的最终状态。
- edits 记录了fsimage状态后每次文件系统的改动(创建,删除,修改),fsimage加上edits记录回放可以使文件系统达到最新状态。
NameNode
元数据目录配置在 dfs.namenode.name.dir 参数中,默认存放了fsimage和edits文件。
root@3849e631794f:~# tree .
.
|-- current
| |-- VERSION
| |-- edits_0000000000000000126-0000000000000000127
| |-- edits_0000000000000000128-0000000000000000129
| |-- edits_0000000000000000130-0000000000000000131
| |-- edits_0000000000000000132-0000000000000000133
| |-- edits_0000000000000000134-0000000000000000135
| |-- edits_0000000000000000136-0000000000000000137
| |-- edits_0000000000000000138-0000000000000000139
| |-- edits_0000000000000000140-0000000000000000141
| |-- edits_0000000000000000142-0000000000000000344
| |-- edits_0000000000000000345-0000000000000000346
| |-- edits_inprogress_0000000000000000347
| |-- fsimage_0000000000000000344
| |-- fsimage_0000000000000000344.md5
| |-- fsimage_0000000000000000346
| |-- fsimage_0000000000000000346.md5
| `-- seen_txid
`-- in_use.lock
root@3849e631794f:~# cat VERSION
namespaceID=399137647
clusterID=CID-b751f050-9af4-43d6-9230-00df3bf8022c
cTime=0
storageType=NAME_NODE
blockpoolID=BP-617896218-172.17.0.2-1467167865960
layoutVersion=-60
- VERSION
layoutVersion 表示hdfs meta文件的格式版本,不同版本的hdfs格式可能不一样 namespaceID/clusterID/blockpoolID hdfs集群的唯一标实,防止datanode注册错误, storageType meta文件类型,NAME_NODE or JOURNAL_NODE cTime 记录文件系统升级的时间
- edits_start transaction ID-end transaction ID: edits log的一段,记录两个事物ID间的文件系统操作,此文件不会再被修改
- edits_inprogress_start transaction ID: 当前开始事务ID的所有文件系统操作
- fsimage_end transaction ID: 事务ID后的完整状态的fsimage,还有一个md5文件做校验,防止磁盘错误。
- seen_txid: 最后一个检查点的事务ID
- in_use.lock: namenode进程的锁文件,防止多个NameNode并发修改
NameNode 在执行 HDFS 客户端提交的创建文件或者移动文件这样的写操作的时候,会首先把这些操作记录在 EditLog 文件之中,然后再更新内存中的文件系统镜像。内存中的文件系统镜像用于 NameNode 向客户端提供读服务,而 EditLog 仅仅只是在数据恢复的时候起作用。记录在 EditLog 之中的每一个操作又称为一个事务,每个事务有一个整数形式的事务 id 作为编号。EditLog 会被切割为很多段,每一段称为一个 Segment。正在写入的 EditLog Segment 处于 in-progress 状态,其文件名形如 editsinprogress${start_txid},其中${starttxid} 表示这个 segment 的起始事务 id。而已经写入完成的 EditLog Segment 处于 finalized 状态,其文件名形如 edits${start_txid}-${end_txid},其中${start_txid} 表示这个 segment 的起始事务 id,${end_txid} 表示这个 segment 的结束事务 id。
DataNode
DataNode 的元数据和数据目录,由dfs.datanode.data.dir 参数配置
root@3849e631794f:~# tree .
.
|-- current
| |-- BP-617896218-172.17.0.2-1467167865960
| | |-- current
| | | |-- VERSION
| | | |-- finalized
| | | | `-- subdir0
| | | | `-- subdir0
| | | | |-- blk_1073741825
| | | | |-- blk_1073741825_1001.meta
| | | | |-- blk_1073741830
| | | | |-- blk_1073741830_1006.meta
| | | | |-- blk_1073741831
| | | | |-- blk_1073741831_1007.meta
| | | | |-- blk_1073741840
| | | | |-- blk_1073741840_1016.meta
| | | | |-- blk_1073741841
| | | | |-- blk_1073741841_1017.meta
| | | | |-- blk_1073741842
| | | | |-- blk_1073741842_1018.meta
| | | | |-- blk_1073741849
| | | | |-- blk_1073741849_1025.meta
| | | | |-- blk_1073741850
| | | | |-- blk_1073741850_1026.meta
| | | | |-- blk_1073741851
| | | | |-- blk_1073741851_1027.meta
| | | | |-- blk_1073741852
| | | | `-- blk_1073741852_1028.meta
| | | `-- rbw
| | |-- dncp_block_verification.log.curr
| | |-- dncp_block_verification.log.prev
| | `-- tmp
| `-- VERSION
`-- in_use.lock
root@3849e631794f:~# cat VERSION
storageID=DS-60143603-ddf2-4422-9e81-adcbcd72f017
clusterID=CID-b751f050-9af4-43d6-9230-00df3bf8022c
cTime=0
datanodeUuid=1150ac32-5f4a-45b2-a8a3-d8032dcd846e
storageType=DATA_NODE
layoutVersion=-56
root@3849e631794f:~/current# cat VERSION
namespaceID=399137647
cTime=0
blockpoolID=BP-617896
- BP-random integer-NameNode-IP address-creation time: blockpoolID的名字, “BP” 是 “block pool” 缩写。如果是federated 部署会有多个BP目录。
- VERSION:和namenode定义相似,namespaceID/clusterID/blockpoolID要和相应的namenode配置一致
- finalized/rbw:这两个目录都是存储block数据,rbw存放的是正在复制副本。
- lazyPersist:hdfs新特性,数据可先写入内存延迟写入磁盘。如果开启此特性才有
- dncp_block_verification.log:周期性做block校验日志,.curr和.prev两个文件切换
- in_use.lock: datanode进程的锁文件,防止多个DataNode并发修改