NameNode和SecondaryNameNode

Posted wnwn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NameNode和SecondaryNameNode相关的知识,希望对你有一定的参考价值。

1.NN和2NN工作机制

    技术图片

   第一阶段:NameNode启动

    (1) 第一次启动NameNode格式化后,创建fsimage和edits文件,如果不是第一次启动,直接加载编辑日志和镜像文件到内存;

    (2) 客户端对元数据进行增删改的请求;

    (3) NameNode记录操作日志,更新滚动日志;

    (4) NameNode在内存中对数据进行增删改查;

  第二阶段:Secondary NameNode工作

    (1) Secondary NameNode询问NameNode是否需要checkpoint直接带回NameNode是否检查结果;

    (2) Secondary NameNode请求执行checkpoint;

    (3) NameNode滚动正在写的edits日志;

    (4) 将滚动的编辑日志文件和镜像文件拷贝到Secondary NameNode;

    (5) Secondary NameNode加载编辑日志和镜像文件到内存,并合并;

    (6) 生成新的镜像文件fsimage.chekpoint;

    (7) 拷贝fsimage.chkpoint到NameNode;

    (8) NameNode将fsimage.chkpoint重命名成fsimage;

  Fsimage:NameNode内存中元数据序列化后形成的文件;

  Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算元数据);

  NameNode启动时,先滚动edits并生成一个空的edits.inprogress,然后加载edits和fsimage到内存中,此时NameNode内存就持有最新的元数据信息,client开始对NameNode发送元数据的增删改查的请求,这些请求的操作首先会被记录的edit.inprogress中(查询元数据的操作不会被记录在edits中,因为查看操作不会更改元数据信息),如果此时NameNode挂掉,重启后从edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改查的操作;

  由于edits中记录的操作会越来越多,edits文件会越来越大,导致NameNode在启动加载edits时会很慢,所以需要edits和fsimage进行合并(所谓合并,就是将edits和fsimage加载到内存中,照着edits中的操作一步步执行,最终形成新的fsimage)。secondarynamenode的作用就是帮助NameNode进行edits和fsimage的合并工作;

  secondaryNameNode首先会询问NameNode是否需要checkpoint(触发checkpoint需要满足两个条件中的任意一个,定时时间到和edits中数据写满了)。直接带回NameNode是否检查结果。secondarynamenode执行checkpoint操作,首先会让NameNode滚动edits并生成一个空的edits.inprogree,滚动edits的目的是给edits打个标记,以后所有新的操作都会写入edits.inprogree,其他未合并的edits和fsimage会拷贝到secondarynamenode的本地,然后将拷贝的edits和fsimage加载到内训中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为fsimage后替换掉原来的fsimage。NameNode在启动时就只需要加载之前未合并的edits和fsimage即可,因为合并过的edits中的元数据信息已经被记录在fsimage中;

2.Fsimage和Edits解析

  NameNode被格式化之后,将在/opt/module/hadoop/data/tmp/dfs/name/current目录中产生如下文件

    技术图片

  Fsimage文件:HDFS文件系统元数据的永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息;

  Edits文件:存放HDFS文件系统的素有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中;

  seen_txis:文件保存的是一个数字,就是最后一个edits_的数字;

  每次NameNode启动的时候都会将fsimage文件读入内存,加载edits里面的更新操作,保存内存中的元数据信息是最新的,同步的,可以看成NameNode启动的时候就将fsimage和edits文件进行了合并;

  2.1 oiv查看Fsimage文件

    2.1.1 查看oiv和oev命令

[root@master current]# hdfs

      技术图片

    2.1.2 基本语法

      hafs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

    2.1.3 实例

[root@master current]# pwd
/opt/module/hadoop/data/temp/dfs/name/current
[root@master current]# hdfs oiv -p XML -i fsimage_0000000000000000580 -o /opt/module/hadoop/fsimage.xml  

  2.2 oev查看edits文件

    2.2.1 基本语法

      hdfs oev -p 文件类型 -i 编辑日志 -o 文件输出路径

    2.2.2 实例

[root@master current]# hdfs oev -p XML -i edits_0000000000000000579-0000000000000000580 -o /opt/module/hadoop/edits.xml

3.CheckPoint时间设置

  通常情况下,SecondaryNameNode每隔一小时执行一次;

  [hdfs-default.xml]

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property >

  一分钟检查一次操作次数,当操作次数达到一百万,SencondaryNameNode执行一次;

<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 >

4.NameNode故障处理

  4.1 将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;

    4.1.1 kill -9 namenode进行号

    4.1.2 删除NameNode存储的数据(/opt/module/hadoop/data/temp/dfs/name)

rm -rf /opt/module/hadoop/data/tmp/dfs/name/*

    4.1.3 拷贝SecondaryNameNode中数据到原NameNode存储数据目录

    4.1.4 重新启动NameNode

  4.2 使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中;

    4.2.1 修改hdfs-site.xml文件

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>120</value>
</property>

<property>
  <name>dfs.namenode.name.dir</name>
  <value>/opt/module/hadoop/data/tmp/dfs/name</value>
</property>

    4.2.2 kill -9 NameNode进程号

    4.2.3 删除NameNode存储的数据(/opt/module/hadoop/data/temp/dfs/name)

rm -rf /opt/module/hadoop/data/tmp/dfs/name/*

    4.2.4 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的评级目录,并删除in_use.lock文件

    4.2.5 导入检查点数据

bin/hdfs namenode -importCheckpoint

5.集群安全模式

  NameNode启动时,首先将映射文件fsimage载入内存,并执行编辑日志edits中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。但是此刻,NameNode运行在安全模式,即NameNode的文件系统对于客户端来说是只读的;

  系统中的数据块的位置并不是有NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送新的块列表信息,NameNode了解到足够都的块位置信息之后,即可搞笑运行文件系统; 

  如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。

  5.1 基本语法

1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) 
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) 
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) 
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)

  5.2 实例

    5.2.1 进入安全模式

bin/hdfs dfsadmin -safemode enter

    5.2.2 执行下面的脚本

#!/bin/bash
bin/hdfs dfsadmin -safemode wait
bin/hdfs dfs -put ~/hello.txt /root/hello.txt

    5.2.3 再打开一个窗口,执行

bin/hdfs dfsadmin -safemode leave

 

以上是关于NameNode和SecondaryNameNode的主要内容,如果未能解决你的问题,请参考以下文章

HDFS的数据流NameNode和SecondaryNameNodeFsimage和Edits解析CheckPoint时间设置NameNode故障处理集群安全模式NameNode多目录配置

04 namenode和datanode

NameNode和SecondaryNameNode

浅析Secondary NameNode与namenode

Hadoop中的Namenode故障和恢复

Hadoop Datanode、namenode、secondary-namenode、job-tracker 和 task-tracker