客户端与HDFS交互过程的实现:
首先,客户端通过调用FileSystem对象中的open()函数来读取它需要的数据,FileSystem是HDFS中DistributedFileSystem的一个实例。DistributedFileSystem会通过RPC协议调用NameNode来确定请求文件块所在的位置。NameNode只会返回所调用文件中开始的几个块而不是全部返回。随后,这些返回的DataNode会按照Hadoop定义集群拓扑结构得出客户端的距离,然后在排序。如果客户端本身就是一个DataNode,那么他将从本地读取文件。
其次,DistributedFileSystem回向客户端返回一个支持文件定位的输入流对象FSDataInputSream,用于给客户端读取数据。FSDataInputStream包含一个DFSInputStream对象,这个对象用来管理DataNode和NameNode之间的I/O。
当以上步骤完成时,客户端便会在这个输入流之上调用read()函数,DFSInputStream对象中包含文件开始部分的数据块所在的DataNode地址,首先它会连接包含文件第一个块最近的DataNode。随后,在数据流中重复调用read()函数,直到这个块全部读完为止。当最后一个块读取完毕时,DFSInputStream会关闭连接,并查找存储下一个数据块距离客户端最近的DataNode。以上这些步骤对客户端来说都是透明的。
客户端按照DFSInputStream打开和DataNode链接返回的数据流的顺序读取该快,她也会调用NameNode来检索下一组块所在的DataNode的位置信息。当客户端完成所有文件的读取时,则会在FSDataInputStream中调用close()函数。
HDFS会考虑读取中节点出现故障的情况。
客户端通过NameNode引导获取最合适的DataNode地址,然后直接连接DataNode读取数据。
一致性模型:
文件系统的一致性模型描述了问价读写的可见性。HDFS牺牲了一些POSIX的需求来补偿性能,所以有些操作可能会和传统的文件系统不同。
创建一个文件系统时,它在文件系统的命名空间中是可见的,但是对这个文件的任何写操作不保证是可见的,即使在数据流已经刷新的情况下,文件的长度很长时间也会显示为0。
HDFS提供了是所有缓存和DataNode之间的数据强制同步的方法,这个方法是FSDataOutputStream中的sync()函数。当sync()函数返回成功时,HDFS就可以保证此时写入的文件数据是一致的并且对于所有新用户都是可见的。