HDFS metadata以树状结构存储整个HDFS上的文件和目录,以及相应的权限、配额和副本因子(replication factor)等。本文基于hadoop2.6-cdh5.16.2版本介绍HDFS Namenode本地目录的存储结构和Datanode数据块存储目录结构以及SecondaryName数据存储目录结构。
官网架构图:
一、NameNode:主
> 存储:文件系统的命名空间
1、文件的名称
2、文件的目录结构
3、文件的属性、权限、创建时间和副本数
4、文件对应被切割为哪些数据块+副本数 --> 数据块分布在哪些NN节点上
> 作用:
管理文件系统的命名空间。维护文件系统树的所有文件及文件夹。这些信息会以两个文件形式永久的保存在本地磁盘上:
》镜像文件fsimage:记录某一永久性检查点(Checkpoint)时整个HDFS的元信息
》编辑日志文件editlog:所有对HDFS的写操作都会记录在此文件中
通过下图可以看到分别有三个角色,分别对应datanode、namenode和secondaryname角色
我们先进入到name目录对其进行分析:
1、edits 编辑日志:
当客户端执行写操作时,首选NN会在编辑日志中写下记录,并在内存中保存一个文件系统元数据,这个描述符会在编辑日志改动之后更新。格式: edits_start transaction ID -end transaction ID
我们通过下面命令查看:
hdfs oev -i edits_0000000000000000001-0000000000000000001 -o ~/tmp/edits.xml
2、fsimage
<?xml version="1.0"?>
<fsimage>
<version>
<layoutVersion>-60</layoutVersion>
<onDiskVersion>1</onDiskVersion>
<oivRevision>4f94d60caa4cbb9af0709a2fd96dc3861af9cf20</oivRevision>
</version>
<NameSection>
<namespaceId>861865381</namespaceId>
<genstampV1>1000</genstampV1>
<genstampV2>1014</genstampV2>
<genstampV1Limit>0</genstampV1Limit>
<lastAllocatedBlockId>1073741838</lastAllocatedBlockId>
<txid>130</txid>
</NameSection>
<INodeSection>
<lastInodeId>16418</lastInodeId>
<numInodes>19</numInodes>
<inode>
<id>16385</id>
<type>DIRECTORY</type>
<name></name>
<mtime>1583259045953</mtime>
<permission>ruoze:supergroup:0755</permission>
<nsquota>9223372036854775807</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16386</id>
<type>DIRECTORY</type>
<name>czz</name>
<mtime>1583256491538</mtime>
<permission>czz:supergroup:0755</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16387</id>
<type>FILE</type>
<name>yarn-site.xml</name>
<replication>1</replication>
<mtime>1583256491531</mtime>
<atime>1583256490783</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>ruoze:supergroup:0644</permission>
<blocks>
<block>
<id>1073741825</id>
<genstamp>1001</genstamp>
<numBytes>690</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<SnapshotSection>
<snapshotCounter>0</snapshotCounter>
<numSnapshots>0</numSnapshots>
</SnapshotSection>
<INodeDirectorySection>
<directory>
<parent>16385</parent>
<child>16386</child>
<child>16391</child>
<child>16389</child>
<child>16405</child>
</directory>
</INodeDirectorySection>
</fsimage>
镜像文件中的一些参数下面会有介绍,请继续下看
3、seen_txid
保存最近一次fsimage或者edits_inprogress的transaction ID。需要注意的是,这并不是Namenode当前最新的transaction ID,该文件只有在checkpoing(merge of edits into a fsimage)或者edit log roll(finalization of current edits_inprogress and creation of a new one)时才会被更新。
这个文件的目的在于判断在Namenode启动过程中是否有丢失的edits,由于edits和fsimage可以配置在不同目录,如果edits目录被意外删除了,最近一次checkpoint后的所有edits也就丢失了,导致Namenode状态并不是最新的,为了防止这种情况发生,Namenode启动时会检查seen_txid,如果无法加载到最新的transactions,Namenode进程将不会完成启动以保护数据一致性。
4、VERSION
> layoutVersion: HDFS metadata版本号,通常只有HDFS增加新特性时才会更新这个版本号
> namespaceID/clusterID/blockpoolID: 这三个ID在整个HDFS集群全局唯一,作用是引导Datanode加入同一个集群。在HDFS Federation机制下,会有多个Namenode,所以不同Namenode直接namespaceID是不同的,分别管理一组 blockpoolID,但是整个集群中,clusterID是唯一的,每次format namenode会生成一个新的,也可以使用-clusterid手工指定ID
> storageType: 有两种取值NAME_NODE /DATA_NODE
> cTime:HDFS创建时间,在升级后会更新该值
二、Datanode:从
> 存储:数据块和数据块校验和
> 与NN进行通信:
1、每隔3s会发送心跳包给NN,告诉NN自己还处于Live状态。
3s的默认时间由配置文件(hdfs-site.xml)中参数:dfs.heartbeat.interval决定.在生产环境中我们都是采用默认三秒,不对其进行修改。
2、每隔一定的时间发生一次blockreport(块报告)
默认时间由配置文件(hdfs-site.xml)中参数:dfs.blockreport.intervalMsec决定. 默认时间为21600000ms=6h,在生产环境中我们会对其优化为3h。当时具体时间的设置需要根据自己业务数据量。
Datanode主要存储数据,下面是一个标准的dfs.datanode.data.dir目录结构
1、BP-random integer-NameNode-IP address-creation time
BP代表BlockPool的意思,就是上面Namenode的VERSION中的集群唯一blockpoolID,如果是Federation HDFS,则该目录下有两个BP开头的目录,IP部分和时间戳代表创建该BP的NameNode的IP地址和创建时间戳2、VERSION
与Namenode类似,其中storageType是DATA_NODE
偶然的一个机会看到下面图中的情况,感觉很有意思
如果让你做选择,你会选择哪项,哈哈哈
3、finalized/rbw目录
这两个目录都是用于实际存储HDFS BLOCK的数据,里面包含许多block_xx文件以及相应的.meta文件,.meta文件包含了checksum信息。
rbw是“replica being written”的意思,该目录用于存储用户当前正在写入的数据。
4、in_use.lock
防止一台机器同时启动多个Datanode进程导致目录数据不一致
三、SecondaryName
> 存储:fsimage+editlog
> 与NN进行通信:定期合并fsimage+editlog文件作为新的fsimage,并推送给NN,简称checkpoint。
为了解决单点故障,只有NN,后来添加了SNN角色,由于合并镜像文件和编辑日志也是需要有时间的(备份机制),虽然能够减轻单点故障,但是依然还是会有风险,所以hadoop又开发了HA机制,具体原理可以参考一下链接:
https://blog.csdn.net/czz1141979570/article/details/86738013
Checkpoint介绍
HDFS会定期(dfs.namenode.checkpoint.period,默认3600秒)的对最近的fsimage和一批新edits文件进行Checkpoint(也可以手工命令方式),Checkpoint发生后会将前一次Checkpoint后的所有edits文件合并到新的fsimage中,HDFS会保存最近两次checkpoint的fsimage。Namenode启动时会把最新的fsimage加载到内存中。
下面是一个标准的dfs.namenode.name.dir目录结构,注意edits和fsimage也可以通过配置放到不同目录中
├── current
│ ├── VERSION
│ ├── edits_0000000000000000001-0000000000000000007
│ ├── edits_0000000000000000008-0000000000000000015
│ ├── edits_0000000000000000016-0000000000000000022
│ ├── edits_0000000000000000023-0000000000000000029
│ ├── edits_0000000000000000030-00000000000000000308
│ ├── edits_00000000000000000308-00000000000000000324
│ ├── edits_inprogress_00000000000000000325
│ ├── fsimage_0000000000000000029
│ ├── fsimage_0000000000000000029.md5
│ ├── fsimage_00000000000000000324
│ ├── fsimage_00000000000000000324.md5
│ └── seen_txid
└── in_use.lock
具体的SNN机制,请百度
1、roll edit
2、传输fsimage+edits
3、merger
4、传输fsimage.chpt to nn
5、回滚 fsimage.ckpt ==> fsimage
edit.new ==< edit
--------------------------
用人品去感动别人,用行动去带动别人,用阳光去照耀别人,用坚持去赢得别人,要求自己每天都去做与目标有关的事情,哪怕每天只进步一点点,坚持下来你就是最优秀卓越的!欢迎大家加入大数据qq交流群:725967421 微信群:flyfish运维实操 一起交流,一起进步!!
--------------------------