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中,找到第一个就可以

 

posted on 2016-07-05 14:25  杰克再造  阅读(248)  评论(0编辑  收藏  举报

导航