设为首页 收藏本站
查看: 985|回复: 0

[经验分享] Hadoop学习二十五:Hadoop-Hdfs FSImage源码

[复制链接]

尚未签到

发表于 2016-12-9 10:12:38 | 显示全部楼层 |阅读模式
一. FSImage作用


  • 加载硬盘镜像文件fsimage到内存。
  • 加载硬盘日志文件edits到内存。这个本来是类FSEditlog的事情,但是是由FSImage负责调用。
  • 保存内存中文件层次结构到硬盘文件fsimage中。
  • 保存内存中操作日志到硬盘文件edits上。按照对应关系,觉得是应该有这么一步吧。但遗憾的告诉你,这一步在整个文件系统中不存在。也就是FSImage可以分为内存和硬盘的,而edits只存在硬盘上,每次操作直接写入edits文件中。
  • 因为FSImage继承Storage,所以FSImage和DataStorage(http://zy19982004.iyunv.com/blog/1878758)一样,会做状态分析-----恢复操作-----状态转换操作。不同的是FSImage的状态转换支持IMPORT启动,对应着doImportCheckpoint()方法。
  • 其它作用。

二. FSImage成员变量


  •  FSEditLog editLog
  • Collection<File> checkpointDirs:FSDirectory初始化时会从配置文件里读取"fs.checkpoint.dir",给其赋值。
  • Collection<File> checkpointEditsDirs:FSDirectory初始化时会从配置文件里读取"fs.checkpoint.edits.dir",给其赋值。

三. FSImage方法


  • boolean recoverTransitionRead(Collection<File> dataDirs,Collection<File> editsDirs,StartupOption startOpt) :完成状态分析-----恢复操作-----状态转换操作后调用boolean loadFSImage(MetaRecoveryContext recovery)。 DSC0000.jpg
  • doImportCheckpoint():Load image from a checkpoint directory and save it into the current one.FSImage需要支持参数-importCheckpoint,该参数用于在某一个checkpoint目录里加载HDFS的目录信息,并更新到当前系统。
  • boolean loadFSImage(MetaRecoveryContext recovery):在所有的Storage中,读取最新的NameNode持久化信息,并应用相应的日志,当loadFSImage()调用返回以后,内存中的目录树就是最新的。loadFSImage()会返回一个标记,如果Storage中有任何和内存中最终目录树中不一致的Image(最常见的情况是日志文件不为空,那么,内存中的fsimage应该是Storage的fsimage加上日志,当然还有其它情况),那么,该标记为true。
    //dirIterator find 最新的NameNode持久化信息StorageDirectory latestNameSD and latestEditsSD
    needToSave |= loadFSImage(getImageFile(latestNameSD, NameNodeFile.IMAGE));
    needToSave |= (loadFSEdits(latestEditsSD, recovery) > 0);

     
  •   boolean loadFSImage(File curFile):从硬盘上加载fsimage文件,应用到内存中。
    //1.循环从FSImage文件输入流in中读取如下基本信息,构建成一个INodeDirectory(INodeDirectory包含INodeFile,INodeFile包含哪些Block等);然后把此INodeDirectory加入FSDirectory中
    for-each{parentINode = fsDir.addToParent(path, parentINode, permissions,
    blocks, replication, modificationTime,
    atime, nsQuota, dsQuota, blockSize);
    }
    //2.加载Datanode信息
    this.loadDatanodes(imgVersion, in);
    //3.load Files Under Construction
    this.loadFilesUnderConstruction(imgVersion, in, fsNamesys);
    //4
    this.loadSecretManagerState(imgVersion, in, fsNamesys);

     
  •  int loadFSEdits(StorageDirectory sd, MetaRecoveryContext recovery):加载edits文件到内存中;如果存在edit.new文件,加载此文件到内存。返回一个load了多少个edits文件。
      int loadFSEdits(StorageDirectory sd, MetaRecoveryContext recovery)
    throws IOException {
    numEdits = FSEditLog.loadFSEdits(edits, recovery);
    if (editsNew.exists() && editsNew.length() > 0) {
    numEdits += FSEditLog.loadFSEdits(edits, recovery);
    }
    return numEdits;
    }
     
  • void saveFSImage(File newFile):保存内存中的文件层次结构到fsimage文件中。和4过程相反。
    // save the root
    saveINode2Image(strbuf, fsDir.rootDir, out);
    // save the rest of the nodes
    saveImage(strbuf, 0, fsDir.rootDir, out);
    fsNamesys.saveFilesUnderConstruction(out);
    fsNamesys.saveSecretManagerState(out);
     
  • void rollFSImage():把所有的edits.new都改为edits(调用editLog.purgeEditLog()),然后再把fsimage.ckpt改为fsimage。对应着http://zy19982004.iyunv.com/admin/blogs/1870624三.6
四. FSImage类图
DSC0001.jpg

五. FSImage其它知识点
  参考http://caibinbupt.iyunv.com/blog/289759

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-311836-1-1.html 上篇帖子: Hadoop学习二十四:Hadoop-Hdfs FSEditLog 源码 下篇帖子: Hadoop学习二十六:Hadoop-Hdfs Lease源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表