IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Hadoop 从SecondaryNamenode 恢复NameNode

    红豆殺发表于 2014-08-15 06:49:43
    love 0

          光从字面上来理解,很容易让一些初学者先入为主的认为:SecondaryNameNode(snn)就是NameNode(nn)的热备进程。其 实不是。snn是HDFS架构中的一个组成部分,但是经常由于名字而被人误解它真正的用途,其实它真正的用途,是用来保存namenode中对HDFS metadata的信息的备份,并减少namenode重启的时间。对于Hadoop进程中 ,要配置好并正确的使用 snn,还是需要做一些工作的。hadoop的默认配置中让 snn进程默认运行在了 namenode 的那台机器上,但是这样的话,如果这台机器出错,宕机,对恢复HDFS文件系统是很大的灾难,更好的方式是:将snn的进程配置在另外一台机器 上运行。


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


          而SecondaryNameNode,会周期性的将EditLog中记录的对HDFS的操作合并到一个checkpoint中,然后清空 EditLog。所以namenode的重启就会Load最新的一个checkpoint,并replay EditLog中 记录的hdfs操作,由于EditLog中记录的是从 上一次checkpoint以后到现在的操作列表,所以就会比较小。如果没有snn的这个周期性的合并过程,那么当每次重启namenode的时候,就会 花费很长的时间。而这样周期性的合并就能减少重启的时间。同时也能保证HDFS系统的完整性。


           这就是SecondaryNameNode所做的事情。所以snn并不能分担namenode上对HDFS交互性操作的压力。尽管如此,当 namenode机器宕机或者namenode进程出问题时,namenode的daemon进程可以通过人工的方式从snn上拷贝一份metadata 来恢复HDFS文件系统。


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

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


    容错性: 当snn创建一个checkpoint的时候,它会将checkpoint拷贝成metadata的几个拷贝。将这个操作运行到另外一台机器,还可以提供分布式文件系统的容错性。


    配置将SecondaryNameNode运行在另外一台机器上

            HDFS的一次运行实例是通过在namenode机器上的$HADOOP_HOME/bin/start-dfs.sh( 或者start-all.sh ) 脚本来启动的。这个脚本会在运行该脚本的机器上启动 namenode进程,而slaves机器上都会启动DataNode进程,slave机器的列表保存在 conf/slaves文件中,一行一台机器。并且会在另外一台机器上启动一个snn进程,这台机器由 conf/masters文件指定。所以,这里需要严格注意,conf/masters 文件中指定的机器,并不是说jobtracker或者namenode进程要 运行在这台机器上,因为这些进程是运行在 launch bin/start-dfs.sh或者 bin/start-mapred.sh(start-all.sh)的机器上的。所以,masters这个文件名是非常的令人混淆的,应该叫做 secondaries会比较合适。然后,通过以下步骤:

    1.修改conf/core-site.xml

    增加
    <property> 
       <name>fs.checkpoint.period</name> 
       <value>3600</value> 
       <description>The number of seconds between two periodic checkpoints. </description> 
    </property>

    <property> 
        <name>fs.checkpoint.size</name> 
        <value>67108864</value> 
        <description>The size of the current edit log (in bytes) that triggers a periodic checkpoint even if the         fs.checkpoint.period hasn't expired. </description> 
    </property>

    <property> 
       <name>fs.checkpoint.dir</name> 
       <value>/data/work/hdfs/namesecondary</value> 
       <description>Determines where on the local filesystem the DFS secondary name node 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>

    fs.checkpoint.period表示多长时间记录一次hdfs的镜像。默认是1小时。 
    fs.checkpoint.size表示一次记录多大的size,默认64M

    2.修改conf/hdfs-site.xml

    增加

    <property> 
       <name>dfs.http.address</name> 
       <value>master:50070</value> 
       <description> The address and the base port where the dfs namenode web ui will listen on. If the port is 0 then the server will start on a free port. </description> 
    </property>

    0.0.0.0改为namenode的IP地址


    3.重启hadoop,然后检查是否启动是否成功

    登录secondarynamenode所在的机器,输入jps查看secondarynamenode进程 
    进入secondarynamenode的目录/data/work/hdfs/namesecondary 

    正确的结果:

     

    如果没有,请耐心等待,只有到了设置的checkpoint的时间或者大小,才会生成。



    4.恢复 
    制造namenode宕机的情况 
    1) kill 掉namenode的进程 

    1. [root@master name]# jps  
    2. 11749 NameNode  
    3. 12339 Jps  
    4. 11905 JobTracker  
    5. [root@master name]# kill 11749  


    2)删除dfs.name.dir所指向的文件夹,这里是/data/work/hdfs/name 
    1. [root@master name]# rm -rf *  

      删除name目录下的所有内容,但是必须保证name这个目录是存在的 

    3)从secondarynamenode远程拷贝namesecondary文件到namenode的namesecondary 
    1. [root@master hdfs]# scp -r slave-001:/data/work/hdfs/namesecondary/ ./  


    4)启动namenode 
    1. [root@master /data]# hadoop namenode –importCheckpoint  

    正常启动以后,屏幕上会显示很多log,这个时候namenode就可以正常访问了 

    5)检查 
    使用hadoop fsck /user命令检查文件Block的完整性 

    6)停止namenode,使用crrl+C或者会话结束 

    7)删除namesecondary目录下的文件(保存干净) 
    1. [root@master namesecondary]# rm -rf *  


    8)正式启动namenode 
    1. [root@master bin]# ./hadoop-daemon.sh  start namenode  


    恢复工作完成,检查hdfs的数据 



    balancer 

    在使用start-balancer.sh时, 
    默认使用1M/S(1048576)的速度移动数据(so slowly...) 
    修改hdfs-site.xml配置,这里我们使用的是20m/S 
    <property> 
    <name>dfs.balance.bandwidthPerSec</name> 
    <value>20971520</value> 
    <description>  Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description> 
    </property> 

    然后结果是导致job运行变得不稳定,出现一些意外的长map单元,某些reduce时间处理变长(整个集群负载满满的情况下,外加20m/s的balance),据说淘宝的为10m/s,需要调整后实验,看看情况如何。 

    1. hadoop balancer -threshold 5  



    安全模式 
    有两个方法离开这种安全模式: 
    (1)修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。 
    dfs.safemode.threshold.pct(缺省值0.999f) 
    HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。 

    (2)hadoop dfsadmin -safemode leave命令强制离开 
    dfsadmin -safemode value 参数value的说明: 
    enter - 进入安全模式 
    leave - 强制NameNode离开安全模式 
    get -  返回安全模式是否开启的信息 
    wait - 等待,一直到安全模式结束。




    参考:

    http://gxjluck.blog.51cto.com/1211751/1288579

    http://running.iteye.com/blog/904473

    Related Posts

    • Hadoop新增datanode与SecondaryNameNode(1)
    • Exception in createBlockOutputStream 04 java.io.IOException: Bad connect ack with firstBadLink(0)
    • zabbix agent一键安装脚本(0)
    • Hadoop集群中banlancer用法简介(1)
    • zabbix监控Hadoop的实现(13)

    Recent Comments



    沪ICP备19023445号-2号
    友情链接