HDFS文件目录介绍

514 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

前言

HDFS metadata以树状结构存储整个HDFS上的文件和目录,以及相应的权限、配额和副本因子(replication factor)等。

一、NameNode

1.1 NameNode目录结构

进入到hadoop-2.8.5/tmp/dfs目录下执行如下命令可查看NameNode目录结构

[root@hadoopserver dfs]# pwd
/usr/local/hadoop-2.8.5/tmp/dfs
[root@hadoopserver dfs]# tree name
name
├── current
│   ├── edits_0000000000000000001-0000000000000000002
│   ├── edits_0000000000000000003-0000000000000000003
│   ├── edits_0000000000000000004-0000000000000000005
│   ├── edits_0000000000000000006-0000000000000000006
│   ├── edits_0000000000000000007-0000000000000000008
│   ├── edits_0000000000000000009-0000000000000000010
│   ├── edits_0000000000000000011-0000000000000000012
│   ├── edits_0000000000000000013-0000000000000000014
│   ├── edits_0000000000000000015-0000000000000000016
│   ├── edits_0000000000000000017-0000000000000000018
│   ├── edits_0000000000000000019-0000000000000000020
│   ├── edits_inprogress_0000000000000000021
│   ├── fsimage_0000000000000000000
│   ├── fsimage_0000000000000000000.md5
│   ├── fsimage_0000000000000000020
│   ├── fsimage_0000000000000000020.md5
│   ├── seen_txid
│   └── VERSION
└── in_use.lock

说明

  • edits_0000xxxx:编辑日志文件
  • edits_inprogress_000xxx:当前打开可写的编辑日志
  • fsimage_000xxx:文件系统镜像文件
  • VERSION:HDFS版本信息的描述文件
  • in_use.lock:一个锁文件,namenode使用该文件为存储目录枷锁,避免其它namenode实例同时使用同一个存储目录的情况。

1.2 VERSION

VERSION文件中包含正在运行的HDFS的版本信息,一般情况下应该包含下面的内容:

[root@hadoopserver current]# pwd
/usr/local/hadoop-2.8.5/tmp/dfs/name/current
[root@hadoopserver current]# cat VERSION
#Sun Jan 24 18:30:09 CST 2021
namespaceID=1433746440
clusterID=CID-86417195-736c-42dd-88ef-45eb47b8562d
cTime=1611484209462
storageType=NAME_NODE
blockpoolID=BP-1210778299-127.0.0.1-1611484209462
layoutVersion=-63

说明

  • namespaceID:文件系统命名空间的唯一标识符,是在namenode首次格式化时创建的;
  • clusterID:将HDFS集群作为一个整体赋予的唯一标识符,当一个集群拥有多个namenode时,数值相同。
  • cTime:属性标记了namenode存储系统的创建时间。对于刚刚格式化的文件系统,这个属性值为0,但是文件系统升级后,改值会更新到新的时间戳。
  • storageType:属性说明该存储目录包含的是namenode的数据结构
  • blockpoolID:是数据块池的唯一标识符,数据块池中包含由一个namenode管理的命名空间中的所有文件。
  • layoutVersion:一个负整数,描述HDFS持久性数据结构的版本,但是改版本号与Hadoop发布的包的版本无关。只要布局变更,版本号就会递减。

二、DataNode

2.1 DataNode目录结构

├── current
│   ├── BP-1958150420-192.168.170.131-1534301954910
│   │   ├── current
│   │   │   ├── finalized
│   │   │   │   └── subdir0
│   │   │   │       └── subdir0
│   │   │   │           ├── blk_1073741825
│   │   │   │           ├── blk_1073741825_1001.meta
│   │   │   │           ├── blk_1073741826
│   │   │   │           ├── blk_1073741826_1002.meta
│   │   │   │           ├── blk_1073741833
│   │   │   │           ├── blk_1073741833_1009.meta
│   │   │   │           ├── blk_1073741834
│   │   │   │           ├── blk_1073741834_1010.meta
│   │   │   ├── rbw
│   │   │   └── VERSION
│   │   ├── dncp_block_verification.log.curr
│   │   ├── dncp_block_verification.log.prev
│   │   └── tmp
│   └── VERSION
└── in_use.lock

说明

  • finalized特殊目录结构解析

    • finalized目录存储了已经完成写入操作的数据块,由于这样的数据块可能非常多,所以finalized目录会以特定的目录结构存储这些数据块。
  • blk_*文件

    • blk_*是数据块文件,其中*代表的数据是数据块id。

    • blk_*_*.meta是数据块校验文件,其中第一个*是数据块id,第二个*代表数据块的版本号。

    • blk的meta校验文件(保存blk的checksum信息)大小大概是blk文件大小的1/128,因为每512字节做一次校验生成4字节校验,在机器上验证了一下大小,接近1/128。

  • in_use.lock文件

    • 这是一个被DataNode线程持有的锁文件,用于防止多个DataNode线程启动并发修改这个存储目录。

2.2 VERSION

[root@hadoop002 current]# cat VERSION

#Tue Aug 14 20:00:18 PDT 2018
storageID=DS-4bc1a0a5-8c82-417a-830d-513ffffcb51f
clusterID=CID-c49b4913-f14f-43d2-bffd-740d6021cc3c
cTime=0
datanodeUuid=af344182-a7f0-4467-9d34-9f77cba81855
storageType=DATA_NODE
layoutVersion=-56

说明

大致和NameNode相同,只有两个有区别

  • storageID:存储id号
  • datanodeUuid:dataNode的唯一识别码

2.3 BP开头文件夹说明

BP-*-*-*

这个目录是一个块池目录,块池目录保存了一个块池在当前存储目录下存储的所有数据块,在Federation部署方式中,DataNode的一个存储目录会包含多个以BP开头的块池目录。

  • BP后面会紧跟一个唯一的随机块池ID。

  • 接下来的第2个*代表当前块池对应的Namenode的IP地址。

  • 最后一个*代表这个块池的创建时间。

查看BP-1958150420-192.168.170.131-1534301954910数据块的版本号:

[root@hadoop002 current]# cd BP-1958150420-192.168.170.131-1534301954910/current
[root@hadoop003 current]# cat VERSION
#Tue Aug 14 20:00:18 PDT 2018
namespaceID=672644148
cTime=0
blockpoolID=BP-1958150420-192.168.170.131-1534301954910
layoutVersion=-56

说明

  • namespaceID:是DataNode首次访问NameNode的时候从NameNode处获取的storageID对每个DataNode来说是唯一的(但对于单个DataNode中所有存储目录来说则是相同的),NameNode可用这个属性来区分不同DataNode。
  • blockpoolID:一个block pool id标识一个block pool,并且是跨集群的全局唯一。当一个新的Namespace被创建的时候(format过程的一部分)会创建并持久化一个唯一ID。在创建过程构建全局唯一的BlockPoolID比人为的配置更可靠一些。NN将BlockPoolID持久化到磁盘中,在后续的启动过程中,会再次load并使用。

2.4 finalized/rbw/tmp文件夹说明

finalized、rbw和tmp目录都是用于存储数据块的文件夹,包括数据块文件及其对应的校验和文件。他们的区别是存放不同状态下的数据块副本文件

DataNode上保存的数据块副本有5种状态:

  • FINALIZED
  • RBW(replica being written)
  • RUR(replica under recovery)
  • RWR(replica waiting to be recovered)
  • TEMPORATY(复制数据块或者进行集群数据块平衡操作时的状态)

说明

  • finalized:保存所有FINALIZED状态的副本

  • rbw:保存RBW、RWR、RUR状态的副本

  • tmp:保存TEMPORARY状态的副本。

过程

(1)如果对应到具体的过程,那么当客户端发起写请求创建一个新的副本时,这个副本会被放到rbw目录中;

(2)当在数据块备份和集群平衡存储过程中创建一个新的副本时,这个副本就会放到tmp目录中;

(3)一旦一个副本完成写操作并被提交,它就会被移到finalized目录中。

当DataNode重启时,tmp目录中的所有副本将会被删除,rbw目录中的副本将会被加载为RWR状态,finalized目录中的副本将会被加载为FINALIZED状态。