HDFS1.0源代码解析—DataNode状态切换

11 篇文章 0 订阅

Hadoop支持软件升级,对于Hadoop这样一个分布式的系统,升级将是一件很复杂的事情。下面介绍升级过程中DataNode的状态切换

首先来看DataNode可能存在的各种状态:

    FORMAT  ("-format"),//格式化,用于系统第一次启动,必须先进行格式
    REGULAR ("-regular"),//用于正常启动
    UPGRADE ("-upgrade"),//进行升级的命令
    ROLLBACK("-rollback"),//升级过程中出现错误,进行回滚
    FINALIZE("-finalize"),//升级稳定后,进行提交
    IMPORT  ("-importCheckpoint");//将系统恢复到某个checkpoint

   

                                                         该图摘在别人博客(感觉画的很透彻)

上图描述了各状态之间的切换流程。

1、DataNoe的具体升级流程如下:见DataStorage.java的doUpgrade方法

    File curDir = sd.getCurrentDir();
    File prevDir = sd.getPreviousDir();
    assert curDir.exists() : "Current directory must exist.";
    // delete previous dir before upgrading
    if (prevDir.exists())
      deleteDir(prevDir);
    File tmpDir = sd.getPreviousTmp();//获取previous.tmp
    assert !tmpDir.exists() : "previous.tmp directory must not exist.";
    // rename current to tmp
    rename(curDir, tmpDir);//将当前的current目录,重命名为previous.tmp
    // hardlink blocks
    linkBlocks(tmpDir, curDir, this.getLayoutVersion(), hardLink);
    // write version file
    this.layoutVersion = FSConstants.LAYOUT_VERSION;
    assert this.namespaceID == nsInfo.getNamespaceID() :
      "Data-node and name-node layout versions must be the same.";
    this.cTime = nsInfo.getCTime();
    sd.write();
    // rename tmp to previous
    rename(tmpDir, prevDir);

获取当前的current和previous目录,如果previous目录存在先删除,将当前current目录重命名为previous.tmp,建立current到previous.tmp的硬链接,在current里写入新的VERSION文件,将previous.tmp改名为previous,完成升级。其实整个升级的过程只是对VERSION文件的改写,对原先的数据文件只是建立了硬链接。

2、DataNode的回滚流程:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值