李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
08.HDFS文件目录介绍
Leefs
2021-09-19 PM
2251℃
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
工具
31
其它
25
GO
47
NLP
4
标签云
Spark RDD
随笔
ajax
LeetCode刷题
链表
Spark Streaming
人工智能
Shiro
Jenkins
锁
Linux
Filter
Thymeleaf
算法
FileBeat
数据结构
RSA加解密
递归
Sentinel
SpringBoot
Jquery
并发编程
NIO
Flume
二叉树
Kafka
Azkaban
JavaWeb
Java
SpringCloudAlibaba
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭