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

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

[复制链接]

尚未签到

发表于 2016-12-9 10:10:51 | 显示全部楼层 |阅读模式
一. INode类图
DSC0000.jpg

二. INode


  •       We keep an in-memory representation of the file/block hierarchy.This is a base INode class containing common fields for file and directory inodes.INode是文件层次结构的反应。
  • INode两个子类:INodeDirectory代表文件目录;INodeFile对应文件。INodeDirectoryWithQuota代表带容量限制的目录,限制了INodeDirectory的使用空间,包含namespace和磁盘空间;INodeFileUnderConstruction代表正在构建的文件,因为有些文件创建时间比较长,目录系统用INodeFileUnderConstruction维护这一信息。 DSC0001.jpg
  • INode
    abstract class INode implements Comparable<byte[]> {
    protected byte[] name;//文件/目录名
    protected INodeDirectory parent;//父目录
    protected long modificationTime;//最后修改时间
    protected long accessTime;//最后访问时间
    private long permission;//permission是访问权限。HDFS采用了和UNIX/Linux类似的访问控制机制。
    //系统维护了一个类似于UNIX系统的组表(group)和用户表(user),并给每一个组和用户一个ID
    //permission在INode中是long型,它同时包含了组和用户信息。
    }
     

三. INodeDirectory


  •  INodeDirectory是HDFS管理的目录的抽象。
  • INodeDirectory维护着多个INode。其方法不外乎增删改查这些INode。
    private List<INode> children;

四.DatanodeID


  • DatanodeID代表一个DataNode,包含了DataNode的配置信息。
      public String name;       // hostname:port (data transfer port)
    public String storageID;  // unique per cluster storageID
    protected int infoPort;   // info server port
    public int ipcPort;       // ipc server port
五.DatanodeInfo


  • DatanodeInfo继承DatanodeID。
  • DatanodeInfo增加了一些动态信息。
      protected long capacity;
    protected long dfsUsed;
    protected long remaining;
    protected long lastUpdate;
    protected int xceiverCount;

六.DatanodeDescriptor


  • DatanodeDescriptor继承DatanodeInfo。
  • DatanodeDescriptor增加了DataNode上block的动态信息。
  • DatanodeDescriptor.BlockTargetPair:代表一个block和此block所处DataNodes的信息的对应关系。
        public final Block block;
    public final DatanodeDescriptor[] targets;
  • DatanodeDescriptor.BlockQueue:维护者一系列BlockTargetPair。
    private final Queue<BlockTargetPair> blockq = new LinkedList<BlockTargetPair>();
  • DatanodeDescriptor维护者一个BlockInfo和两个BlockQueue和一个Set<Block>。
      private volatile BlockInfo blockList = null;
    /** A queue of blocks to be replicated by this datanode */
    //该DataNode上正在复制(replicateBlocks)的Block
    private BlockQueue replicateBlocks = new BlockQueue();
    /** A queue of blocks to be recovered by this datanode */
    //该DataNode上正在Lease恢复(recoverBlocks)的Block
    private BlockQueue recoverBlocks = new BlockQueue();
    /** A set of blocks to be invalidated by this datanode */
    //该DataNode上已经失效的Block
    private Set<Block> invalidateBlocks = new TreeSet<Block>();
七.BlockInfo


  •  BlockInfo继承Block。
  • BlockInfo保存了该Block归属的INodeFile和DatanodeDescriptor,同时还包括了它的前继和后继Block。
    private INodeFile  inode;
    private Object[] triplets;
  • 一个BlockInfo结构如下,tripltes[0]指向此BlockInfo所在的DatanodeDescriptor,tripltes[1]指前继BlockInfo,tripltes[2]指向后继BlockInfo。 DSC0002.jpg

八.BlocksMap


  •  BlocksMap保存了一系列Block到BlockInfo对应关系的。
    private GSet<Block, BlockInfo> blocks;
  • 结合上图可知,有了BlocksMap,就可以通过Block找对应的文件和这个Block所存放的DataNode的相关信息。

九.INodeFile


  • INodeFile是HDFS管理文件的抽象。
  • 一个INodeFile对应着多Block。如上图示。
    protected BlockInfo blocks[] 
十.分析一条线


  •  http://zy19982004.iyunv.com/blog/1890775文中三.8我们提到:定期调用namenode.blockReport()发送block report 告诉NameNode此DataNode上的block信息。接着分析:
  • 看看远程RPC代理类NameNode的blockReport()方法,调用namesystem.processReport(DatanodeRegistration, blockList)。
      public DatanodeCommand blockReport(DatanodeRegistration nodeReg,
    long[] blocks) throws IOException {
    namesystem.processReport(nodeReg, blist);
    }
  • FSNamesystem的processReport方法:找到是哪个DataNode发送过来的信息;执行此DataNode的reportDiff方法,找出和现在FSNamesystem维护着的block的差别;FSNamesystem修改差别。
    public synchronized void processReport(DatanodeID nodeID,
    BlockListAsLongs newReport
    ) throws IOException {
    DatanodeDescriptor node = getDatanode(nodeID);
    //
    // Modify the (block-->datanode) map, according to the difference
    // between the old and new block report.
    //
    node.reportDiff(blocksMap, newReport, toAdd, toRemove, toInvalidate);
    ...
    }
  • DatanodeDescriptor.reportDiff(...newReport...):分析差别。因为DatanodeDescriptor保存着此DataNode上所有Block的动态信息,把newReport(就是2里面的blockList)与之比较即可。


十一.说明
  本文有些地方并没有完全区分BlockInfo和Block,为了理解的方便,我会把BlockInfo当成Block;同样的我会把DatanodeDescriptor,DatanodeInfo当成DaNode。

运维网声明 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-311834-1-1.html 上篇帖子: Hadoop学习十七:Hadoop-Hdfs DataXceiverServer源码写数据 下篇帖子: Hadoop学习二十四:Hadoop-Hdfs FSEditLog 源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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