NameNode&Secondary NameNode 工作机制
阅读原文时间:2022年03月04日阅读:1

NameNode&Secondary NameNode 工作机制

NameNode:
    1.启动时,加载编辑日志和镜像文件到内存
    2.当客户端对元数据进行增删改,请求NameNode
    3.NameNode记录操作日志,更新滚动日志
    4.日志记录完成,在NameNode内存中对元数据进行操作
    edits.001 操作日志
    edits.002
    edits.inprogress 正在进行的操作日志
    fsimage 镜像文件
SecondaryNameNode:(其主要作用就是:合并edit和fsimage)
    0.检查点(checkpoint)触发。条件是:
        a.定时时间到(默认一个小时)
        b.操作日志中的数据满了(100w次操作)
    1.请求NameNode是否需要CheckPoint,直接带回 NameNode是否检查结果
    2.执行CheckPoint请求
    3.滚动正在写的操作日志,生成最新的一个操作日志
    4.将操作日志和之前旧的镜像fsimage文件拷贝到SecondaryNameNode
    5.在SecondaryNameNode内存中合并日志文件和fsimage文件
    6.生成新的fsimage.chkpoint
    7.将fsimage.chkpoint拷贝到NameNode中
    8.重命名fsimage.chkpoint为fsimage

日志文件

目录结构:

$HADOOP_HOME/data/tmp/dfs/name/current
$HADOOP_DATA_HOME/tmp/dfs/name/current

edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION

1.fsimage:
    HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS文件系统的所有目录和文件 idnode 的序列化信息
2.edits:
    存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 edits 文件中。
3.seen_txid:
    文件保存的是一个数字,就是最后一个 edits_的数字

    每次 Namenode 启动的时候都会将 fsimage 文件读入内存,
    并从 00001 开始到 seen_txid 中记录的数字依次执行每个 edits 里面的更新操作,
    保证内存中的元数据信息是最新的、同步的,可以看成 Namenode 启动的时候就将 fsimage 和 edits 文件进行了合并。

查看fsimage文件和edits文件

oiv 查看 fsimage 文件
    hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
    hdfs oiv -p XML -i fsimage_0000000000000000025 -o  /opt/module/hadoop-2.7.2/fsimage.xml

oev 查看 edits 文件
    hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
    hdfs  oev  -p  XML  -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml

chkpoint 检查 时间 参数 设置

hdfs-default.xml

<!-- 默认:SecondaryNameNode 每隔一小时执行一次 -->
    <property>
        <name>dfs.namenode.checkpoint.period</name>
        <value>3600</value>
    </property>

<!-- 一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次。 -->
    <property>
        <name>dfs.namenode.checkpoint.txns</name>
        <value>1000000</value>
        <description>操作动作次数</description>
    </property>
    <property>
        <name>dfs.namenode.checkpoint.check.period</name>
        <value>60</value>
        <description> 1 分钟检查一次操作次数</description>
    </property>

NameNode多目录配置

NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
配置步骤:

(1)在 hdfs-site.xml 文件中增加如下内容
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
    </property>

(2)停止集群,删除 data 和 logs 中所有数据
    $ rm -rf data/ logs/
(3)格式化集群并启动。
    $ bin/hdfs namenode –format
    $ sbin/start-dfs.sh