Class ClientProtocol是HDFS客户端与NameNode之间的接口。Client通过调用ClientProtocol的方法完成与NameNode之间的交互。本文分析方法getBlockLocations。该方法的方法声明如下:
public LocatedBlocks getBlockLocations(String src,long offset, long length)throws IOException
该方法用于获取一个给定文件的偏移和数据长度的所有数据库块(block)的数据节点(datanode)。该方法的参数如下:
src:文件的名称
offset:文件的开始位置,文件开始的偏移
length:需要获取文件数据的长度
该方法返回LocatedBlocks,LocatedBlocks包含文件长度、数据块blocks、数据块block的datanode等信息。注意,每一个block的所有datanode按照其距离client的距离进行排序。
下面我们看一下具体是怎么获得文件给定范围内数据的数据块和数据块所在的datanode的。首先,HDFS在内存中包含了整个文件系统的一个映像,包括INodeFile(对应于硬盘上的文件)、INodeDirectory(对应于硬盘上的文件夹)等。可以阅读文件《FSNamesystem中有几个非常重要的变量》。
为了获取文件的数据块,我们首先需要从文件系统中命名空间中获取代表该文件