李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
08.HDFS文件目录介绍
Leefs
2021-09-19 PM
2965℃
0条
[TOC] ### 前言 `HDFS metadata`以树状结构存储整个HDFS上的文件和目录,以及相应的权限、配额和副本因子(replication factor)等。 ### 一、NameNode #### 1.1 NameNode目录结构 进入到`hadoop-2.8.5/tmp/dfs`目录下执行如下命令可查看NameNode目录结构 ```bash [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的版本信息,一般情况下应该包含下面的内容: ```bash [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目录结构 ```bash ├── 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 ```bash [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数据块的版本号:** ```bash [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状态。 *附参考文章链接:* *https://www.cxyzjd.com/article/m0_37613244/109920466*
标签:
Hadoop
,
HDFS
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1504.html
上一篇
07.HDFS之Fsimage和Edits详解
下一篇
06.Kafka文件存储机制
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
NIO
Elasticsearch
SpringCloudAlibaba
Stream流
Golang
LeetCode刷题
持有对象
Map
Thymeleaf
Quartz
nginx
Linux
Flink
Ubuntu
Zookeeper
Git
gorm
数据结构
算法
Scala
MyBatis
MySQL
VUE
Hbase
ajax
Spark RDD
排序
Redis
Kafka
Spark Core
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞