hadoop的secondarynamenode总结

一、SecondaryNameNode概念:

    光从字面上来理解,SecondaryNameNode(snn)就是NameNode(nn)的热备进程。其实不是,ssn是HDFS架构中的一个组成部分,它真正的用途,是用来保存namenode中对HDFS metadata信息的备份,并减少namenode重启的时间。hadoop的默认配置中让snn进程默认运行在了namenode的那台机器上,如果这台机器出错,宕机,对恢复HDFS文件系统是很大的灾难,更好的方式是:将snn的进程配置在另外一台机器上运行。

    在hadoop中,namenode负责对HDFS的metadata的持久化存储,并且处理来自客户端的对HDFS的各种操作的交互反馈。为了保证交互速度,HDFS文件系统的metadata是被load到namenode机器的内存中的,并且会将内存中的这些数据保存到磁盘进行持久化存储。为了保证这个持久化过程不会成为HDFS操作的瓶颈,hadoop采取的方式是:没有对任何一次的当前文件系统的snapshot进行持久化,对HDFS最近一段时间的操作list会被保存到namenode中的一个叫Editlog的文件中去。当重启namenode时,除了load fslmage意外,还会对这个Editlog文件中记录的HDFS操作进行replay,以恢复HDFS重启之前的最终状态。

    SecondaryNameNode,会周期性的将Editlog中记录的对HDFS的操作合并到一个checkpoint中,然后清空Editlog。所以namenode的重启就会Load最新的一个checkpoint,并replay Editlog中记录的hdfs操作,由于Editlog中记录的是从上一次checkpoint以后到现在的操作列表,所以就会比较小,整个hdfs集群的启动速度会加快。如果没有snn的这个周期性的合并过程,那么当每次重启namenode的时候,就会花费很长的时间。而这样周期性的合并就能减少重启的时间。同时也能保证HDFS系统的完整性。这就是SecondaryNameNode所做的事情。所以snn并不能分担namenode上对HDFS交互性操作的压力。尽管如此,当namenode机器宕机或者namenode进程出问题时,namenode的daemon进程可以通过人工的方式从snn上拷贝一份metadata来恢复HDFS文件系统。

    至于为什么要将snn进程运行在一台非NameNode的机器上,这主要出于两点考虑:

1、可扩展性:创建一个新的HDFS的snapshot需要将namenode中load到内存的metadata信息全部拷贝一遍,这样的操作需要的内存和namenode占用的内存一样,由于分配给namenode进程的内存其实是对HDFS文件系统的限制,如果分布式文件系统非常的大,那么namenode那台机器的内存就可能会被namenode进程全部占据。

2、容错性:当snn创建一个checkpoint的时候,它会将checkpoint拷贝成metadata的几个拷贝。将这个操作运行到另外一台机器,还可以提供分布式文件系统的容错性,namenode不可用时,可以利用secondarynamenode中的目录数据恢复namenode。

二、日志与镜像的定期合并总共分五步:

    1、SecondaryNameNode通知NameNode准备提交edits文件,此时主节点产生edits.new
    2、SecondaryNameNode通过http get方式获取NameNode的fsimage与edits文件(在SecondaryNameNode的current同级目录下可见到 temp.check-point或者previous-checkpoint目录,这些目录中存储着从namenode拷贝来的镜像文件)
    3、SecondaryNameNode开始合并获取的上述两类文件,产生一个新的fsimage文件fsimage.ckpt
    4、SecondaryNameNode用http post方式发送fsimage.ckpt至NameNode
    5、NameNode将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fstime整个checkpoint过程到此结束。 SecondaryNameNode备份由三个参数控制fs.checkpoint.period控制周期,fs.checkpoint.size控制日志文件超过多少大小时合并, dfs.secondary.http.address表示http地址,这个参数在SecondaryNameNode为单独节点时需要设置。

<!--二级地址配置-->
<property>
    <name>dfs.secondary.http.address</name>
    <value>slave22:50090</value>
</property>

<!--secondaryname 定时备份的时间间隔,默认为1小时-->
<property>
  <name>fs.checkpoint.period</name>
  <value>3600</value>
  <description>The number of seconds between two periodic checkpoints.
  </description>
</property>

<!--edit中记录的日志文件超过多大时,才进行合并,默认为64MB-->
<property>
  <name>fs.checkpoint.size</name>
  <value>67108864</value>
</property>

<!--secondarynamenode进行合并的文件目录-->
<property>
  <name>fs.checkpoint.dir</name>
  <value>/data/dfs/secondarynamenode</value>
  <description>Determines where on the local filesystem the DFS secondary namenode should store the temporary images to merge.If this is a comma-delimited list of directories then the image is replicated in all of the directories for redundancy.</description>
</property>

三、恢复

    1、首先我们kill掉namenode进程,然后将dfs.namenode.name.dir目录下的数据删除掉。 下图为清理之前的目录文件列表。

    2、将secondarynamenode下的检查点目录fs.checkpoint.dir拷贝到与dfs.namenode.name.dir平级的目录下。

    3、启动namenode的时候采用hadoop namenode -importCheckpoint。此时,能够正常启动nameNode,并在dfs.namenode.name.dir中恢复了namenode的数据,通过另外一个shell进行查看,是否恢复正常。

    4、关闭namenode,按照正常启动的方式启动namenode。检查数据目录是否恢复正常,下图为恢复之后的目录文件列表,历史编辑日志文件消失。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ant-666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值