• NameNode中的FSImage文件


    第一:结构

    1:下图是FSImage数据结构图

    以看出,fsimage保存有如下信息:

    1. 首先是一个image head,其中包含:

    a) imgVersion(int):当前image的版本信息

    b) namespaceID(int):用来确保别的HDFS instance中的datanode不会误连上当前NN

    c) numFiles(long):整个文件系统中包含有多少文件和目录

    d) genStamp(long):生成该image时的时间戳信息。

    2. 接下来便是对每个文件或目录的源数据信息,如果是目录,则包含以下信息:

    a) path(String):该目录的路径,如”/user/build/build-index”

    b) replications(short):副本数(目录虽然没有副本,但这里记录的目录副本数也为3

    c) mtime(long):该目录的修改时间的时间戳信息

    d) atime(long):该目录的访问时间的时间戳信息

    e) blocksize(long):目录的blocksize都为0

    f) numBlocks(int):实际有多少个文件块,目录的该值都为-1,表示该item为目录

    g) nsQuota(long)namespace Quota值,若没加Quota限制则为-1

    h) dsQuota(long)disk Quota值,若没加限制则也为-1

    i) username(String):该目录的所属用户名

    j) group(String):该目录的所属组

    k) permission(short):该目录的permission信息,如644等,有一个short来记录。

    3. 若从fsimage中读到的是一个文件,则还会额外包含如下信息:

    a) blockid(long):属于该文件的blockblockid

    b) numBytes(long):该block的大小

    c) genStamp(long):该block的时间戳

    3中是Block类的成员变量;通过BlockMap继承了Block类且新增了自己的成员变量;如下图:

    最后是通过BlockInfo对象来实现block和datanode对应的。

    为什么以上诉形式保存这个block对应datanode的list?

    Namenode采用这种结构来保存block->datanode list的目的在于节约namenode内存。由于namenode将block->datanodes的对应关系保存在了内存当中,随着HDFS中文件数的增加,block数也会相应的增加,namenode为了保存block->datanodes的信息已经耗费了相当多的内存,如果还像这种方式一样的保存datanode->block list的对应表,势必耗费更多的内存,而且在实际应用中,要查一个datanode上保存的block list的应用实际上非常的少,大部分情况下是要根据block来查datanode列表,所以namenode中通过上图的方式来保存block->datanode list的对应关系,当需要查询datanode->block list的对应关系时,只需要沿着该数据结构中next Block的指向关系,就能得出结果,而又无需保存datanode->block list在内存中。

    总结: Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像;其中文件系统的名字空间通过FSImage文件保存在本地操作系统的文件中;文件数据映射就是在读取FSImage文件时会添加额外内容BlockMap;这个内容没有永久性固化,而是在内存中存有。这个文件是NameNode功能的核心;它是可以永久性固化,就需要经常使用Load和Save操作,来实现这个过程。

    2:EditsLog文件:

    在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样地,修改文件的副本系数也将往Editlog插入一条记录。Namenode在本地操作系统的文件系统中存储这个Editlog。设计出它的目的就是不想一改就全部修改FSImage内容,而是修改那些变动的内容;且在宕机时,也需要用它和前期的FSImage来创建内存中的FSImage。

    如下图得出原因:

    存放的文件位置如下:

    第二:流程

    1:第一检查点,就是NN启动时将FSImage内容加载到内存中,通过输入输出流;

    2:初始化NN的BlockMap;等待DN的反馈信息。

    3:之后就是循环检查点,每次的检查是发生在DN启动时,当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告,NN根据这个信息构造BlockInfo对象更新这个对象。

     未完待续。。。。

     http://hi.baidu.com/yumovrldlubhvxq/item/d2105ce99d19073f8d3ea88e

  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/miner007/p/3745332.html
Copyright © 2020-2023  润新知