1.文件的读取:
首先、客户端铜鼓调用FileSystem对象中的open()函数读取它需要的数据。FileSystem是HDFS中DistributeFileSystem的一个实例。DistributeFileSystem会通过RPC协议调用NameNode来确定请求文件所在的位置,对于每个返回的块都包换块所在的DataNode地址,随后这些返回的DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离。然后再进行排序,如果客户端本身就是一个DataNode那么它将从本地读取文件。这里要关注的一个设计要点是,客户端通过NameNode引导获取最合适的DataNode地址,然后直接连接DataNode读取数据。这种设计的好处,这可以使HDFS扩展到更大规模的客户端并行处理。这是因为数据的流动所有的DataNode之间分散进行的,同时NameNode的压力也变小。
2.文件写入
①客户端通过调用DistributeFileSystem对象中的Create()创建一个文件,通过RPC()调用在NameNode的文件系统命名空间中创建一个新文件。
②NaneNode会通过多种验证保证新的文件不存在文件系统中,并且确保请求客户端有创建按文件的权限。如果成功distributeFileSystem返回一个FSDataOutputStream给客户端写人数据
③当客户端写入数据时,DFSoutputStream会将文件分割成包,然后放入内部队列,DataStreamer,作用是请求NameNode为新的文件包分配合适的DataNode存放副本。
④DFSoutputStream同时也会保存在一个包的内部队列,用来等待管道中的DataNode返回确认信息。
《hadoop实战第二版》… 机械工业出版社 ….. 陆嘉恒著;