HDFS------namenode中的ClientProtocol的实现

一. 先来看public LocatedBlocks  getBlockLocations(String src,long offset, long length) throws IOException;

这个方法:返回文件的块的位置。

返回值LocatedBlocks的类图:


方法的调用序列图:

关键的部分集中在getBlockLocationsInternal方法中。这个方法的主流程分以下几步:

1.通过FSDirectory的getFileINode方法获取src对应的INode,然后通过INode的getBlocks方法获取所对应的Block数组;

2.第一步当中获取的Block数组,对于其中的每个Block构造与之对应的LocatedBlock,并将各个LocatedBlock放到一个列表results中;

3.将第二步的结果results作为参数,调用inode的createLocatedBlocks方法构造最终需要的LocatedBlocks。

1和3比较简单,这里提一下2:Block对应的具体datanode的信息(DatanodeDescriptor)存放在BlocksMap中。

二.看下create方法:在namespace中创建一个新文件

显然,主要工作集中在startFileInternal方法中。这个方法会被create方法以及append方法调用,因此它里面的逻辑包括这两部分,我们先来看create部分。

略过方法中的细节,其实startFileInternal只做了两件事:一是通过FSDirectory的addFile构建了一个新的INodeFileUnderConstruction节点;一是在leaseManager中添加了一个新的记录。

append方法与create方法雷同,调用完startFileInternal之后,append会去获取文件INodeFile的最后一个Block,然后在通过BlockMap获取Block所对应的DatanodeDescriptor,进而构造LocateBlock。

三.setReplication方法:设置文件的副本数

序列图同上,这里不画了。主要流程在setReplicationInternal方法中。它的主要工作如下:

1.一些乱七八糟的验证工作:安全模式判定,检查副本数,检查文件权限等;

2.通过FSDirectory的setReplication方法来获取文件的Block列表fileBlocks,并且设置了oldReplication;

3.通过updateNeededReplications方法来添加副本;

4.通过processOverReplicatedBlock方法来删除多余的副本。这个方法比较细,主要分为两部分:先找出这个block对应的正常状态的datanode信息DatanodeDescriptor;再调用chooseExcessReplicates方法,这个方法中会根据优先级删除block(源机上,同机架,其余机架)

四.reportBadBlocks方法:客户发现了located blocks的错误,并把错误报告给namenode

reportBadBlocks方法遍历LocatedBlock[] blocks,为每个block调用markBlockAsCorrupt方法。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值