HDFS--DFSClient中的读Block机制
BlockReader中的readChunk用于从DataNode中读取块信息和块数据(chunk=block);read方法如果发现块数据校验码无误,就向DataNode发送OP_STATUS_CHECKSUM_OK表示无错误发生。
DFSInputStream是DFSClient用于读取文件块的方法,其内包含了blockReader用于与DataNode交互(在readBuffer中调用BlockReader的read方法读取块内容)。
在读取文件块时,采用预读取方式,根据访问局部性原理,从offset开始(offset初始为0,即文件头),将长度为prefetchSize的块集合信息读到localBlocks(这是一个LocalBlock列表,可以视为缓存。LocalBlock是由{Block,DatanodeInfo[]}构成的pair,用于定位块,继承于Writeable)中,即
int read(long position, byte[] buffer, int offset, int length)(注:position为要读取的文件开始位置,offset是从buffer的offset位置开始存)时,首先调用getBlockRange获取length范围内的所有块的LocalBlock,再对于每个LocalBlock依次调用fetchBlockByteRange读取相应的块到buffer中(执行流程是先根据LocalBlock生成一个BlockReader对象,在调用这个reader的readerAll方法读取块到buffer中)