这个方法:返回文件的块的位置。
返回值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方法。