LocatedBlock
这个类是用于记录HDFS的Block对应的所有datanode的信息
源码如下:
public class LocatedBlock { private final ExtendedBlock b; private long offset; // 该block对应于文件的第一个byte的offset private final DatanodeInfo[] locs; // 这个block是在哪些datanode上面 /** Storage ID for each replica */ private final String[] storageIDs; // 对应备份replica的datanode的storage id有哪几个 // Storage type for each replica, if reported. private final StorageType[] storageTypes; // 这个底层的datanode的storage 类型是什么 // corrupt flag is true if all of the replicas of a block are corrupt. // else false. If block has few corrupt replicas, they are filtered and // their locations are not part of this object private boolean corrupt; private Token<BlockTokenIdentifier> blockToken = new Token<BlockTokenIdentifier>(); // 这个block的security taken是什么 //................ }
不得不说在DFSInputStream.java中,叫blockSeekTo的方法
通过输入一个文件的偏移量,返回在哪个datanode上去取是最好的
内部实现有2步:
1. 首先找到根据这个偏移量,对应的block有哪些,返回LocatedBlock对象,方法是blockSeekTo
如果offset大于文件长度,报错
如果offset大于已知的block的长度,则返回最后一个block
这样可以在cache中找到LocatedBlock对象
2. 然后根据算法,给出哪个datanode是最佳的,方法是chooseDataNode
在这个方法里面,从block得到所有locations和storage type,顺序开始找,条件是不在ignore nodes中,找到第一个就可以