Hadoop NameNode启动之FSImage、edits重置(三)

   Namenode启动过程中,在FSImage载入后,会对FSImage和edits重置,相当于创建一组新的镜像文件和日志文件,但前提是前面的载入都已经成功了,这个操作紧跟fsImage.recoverTransitionRead之后,具体调用流程如下:

Namenode.main ->NameNode.createNameNode -> NameNode.initialize -> FSNameSystem.initialize-> FSDirecotry.loadFSImage -> fsImage.saveNamespace

这个函数内部流程很清晰,会经历如下步骤:

       1、关闭edits日志文件

       2、将当前current目录重命名为lastcheckpoint.tmp

       3、保存新的image到current目录

       4、在current目录中创建edits

       5、将第二步中lastcheckpoint.tmp重命名为previous.checkpoint

       6、打开fsiamge和edits文件

void  saveNamespace(boolean renewCheckpointTime) throws IOException {
    //关闭edits日志文件
    editLog.close();
    if(renewCheckpointTime)
      this.checkpointTime = FSNamesystem.now();
 
   //将当前current目录重命名为lastcheckpoint.tmp
   for(Iterator<StorageDirectory> it = dirIterator(); it.hasNext();) {
      StorageDirectory sd = it.next();
      try {
        //开始重命名操作,实际调用File.renameTo函数
        moveCurrent(sd);
      } catch(IOException ie) {
        LOG.error("Unable to move current for " + sd.getRoot(), ie);
        removeStorageDir(sd.getRoot());
      }
    }
 
    // save images into current
    for (Iterator<StorageDirectory> it =dirIterator(NameNodeDirType.IMAGE);it.hasNext();){
      StorageDirectory sd = it.next();
      try {
       //在这个函数中会创建current目录,保存新的fsimage、创建新的edits,
       //注意此时edits是初始化状态,只写入了一个LAYOUT_VERSION
       //创建VERSION fstime文件
        saveCurrent(sd);
      } catch(IOException ie) {
        LOG.error("Unable to save image for " + sd.getRoot(), ie);
        removeStorageDir(sd.getRoot());
      }
    }
 
    // -NOTE-
    // If NN has image-only and edits-onlystorage directories and
    // fails here
    // the image will have the latest namespace state.
    // During startup the image-only directories will recoverby discarding
    // lastcheckpoint.tmp, while
    // the edits-only directories will recover by fallingback
    // to the old state contained in theirlastcheckpoint.tmp.
    // The edits directories should be discarded duringstartup because their
    // checkpointTime is older than that of imagedirectories.
 
    // recreate edits in current
   for (Iterator<StorageDirectory> it =dirIterator(NameNodeDirType.EDITS);it.hasNext();) {
      StorageDirectory sd = it.next();
      try {
        saveCurrent(sd);
      } catch(IOException ie) {
        LOG.error("Unable to save edits for " + sd.getRoot(), ie);
        removeStorageDir(sd.getRoot());
      }
  }
   //将第二步中lastcheckpoint.tmp重命名为previous.checkpoint
 
   for(Iterator<StorageDirectory> it = dirIterator(); it.hasNext();) {
      StorageDirectory sd = it.next();
      try {
        moveLastCheckpoint(sd);
      } catch(IOException ie) {
        LOG.error("Unable to move last checkpoint for" + sd.getRoot(),ie);
        removeStorageDir(sd.getRoot());
      }
    }
    if(!editLog.isOpen()) editLog.open();
    ckptState = CheckpointStates.UPLOAD_DONE;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Secondary NamenodeHadoop 集群中的一个重要组件,主要负责协助 NameNode 完成一些工作,如备份和合并 fsimageeditlog 文件。 Secondary Namenode 能够有效的缩短 Hadoop 集群的启动时间,主要是因为: 1. 辅助 NameNode启动:当 NameNode 启动的时候,需要将内存中的数据持久化到磁盘,这个过程比较耗时,而 Secondary Namenode 可以在 NameNode 启动之前,帮助将内存数据写入到磁盘,从而加快 NameNode启动时间。 2. 减少 Namenode 的工作量:NameNode 负责管理整个 Hadoop 集群的元数据,随着集群规模的增大,元数据的大小也会不断增加,导致 NameNode 的工作量变得越来越大。而 Secondary Namenode 可以定期的从 NameNode 中备份元数据,并且合并 fsimageeditlog 文件,从而减轻了 NameNode 的工作压力。 综上所述,Secondary NamenodeHadoop 集群中具有非常重要的作用,能够有效的缩短 Hadoop 集群的启动时间,同时减轻 NameNode 的工作压力,提高集群的稳定性。 ### 回答2: secondary namenodehadoop中辅助namenode的一个节点,负责周期性地将namenode的数据合并成一个新的镜像,并将该镜像发送给namenode,以便在namenode故障时帮助它重新启动。secondary namenode并不是集群中的核心节点,但它的作用却十分重要。使用secondary namenode可以大大缩短hadoop集群的启动时间,具体原因如下: 1.帮助主节点恢复快速 主节点(namenode)存储了整个HDFS文件系统的元数据,因此如果主节点故障,整个HDFS文件系统将无法使用。但是,如果有secondary namenode存在,secondary namenode会持续地从主节点中拷贝namenode的状态,并会在主节点故障时对其进行恢复。这样就可以更快地使整个HDFS文件系统恢复正常,从而有效缩短了集群的启动时间。 2.辅助namenode工作 namenode是整个HDFS系统的核心,如果它在启动时遇到了问题,那么整个HDFS文件系统会受到影响。但是,如果有secondary namenode存在,它可以辅助namenode工作,从而处理更多数据,使namenode在重建HDFS文件系统时,更加高效地完成工作。 综上所述,secondary namenode作为集群中的一个辅助节点,它的存在可以帮助主节点故障快速恢复,同时辅助namenode高效地完成文件系统重建,因此可以有效缩短hadoop集群的启动时间,提高HDFS的可靠性和效率。 ### 回答3: Secondary NameNodeHadoop集群中的一个重要组件,它可以有效缩短Hadoop集群的启动时间。 通常情况下,Hadoop集群的NameNode节点存储大量的元数据信息,以确保Hadoop集群的正常运行。但是,随着数据量的增加和时间的推移,NameNode的元数据信息也会不断增加,这会导致Hadoop集群的启动时间慢慢变长。 为了解决这一问题,Hadoop引入了Secondary NameNode作为辅助节点来协助NameNode执行一些任务,例如合并fsimageedits文件、监控HDFS集群的健康状态等。通过运用Secondary NameNode,可以将NameNode的负载分散到多个节点上,从而大大提高了Hadoop集群的启动速度和稳定性。 具体来说,Secondary NameNode通常会执行两种任务。一是定期从NameNode中获取元数据信息,并将其合并成一个镜像文件fsimage,这个文件可以保留与NameNode相同的元数据信息,从而可以恢复出错的NameNode。二是定期将NameNodeedits日志中积累的命名空间的变更应用到fsimage文件,以确保fsimage文件的信息与实际情况相符合。 由此可见,Secondary NameNode是非常重要的一个组件,它能够缩短Hadoop集群的启动时间,提高Hadoop集群的稳定性和可靠性。同时,我们也可以采取一些措施,例如增加节点数量、优化节点配置等,来进一步提高Hadoop集群的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值