Hadoop-HDFS组件中的本地存储目录(NN/DN/SNN)结构剖析

    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运维实操    一起交流,一起进步!!
--------------------------
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章