一、HDFS读文件过程
1、客户端调用DistributedFileSystem的对象实例FileSystem的open方法来打开希望读取的文件,调用open后会返回一个FSDataInputStream对象。
2、分布式文件系统DistributedFileSystem通过RCP(远程过程调用)来调用namenode,以确定文件的起始块的位置(这些信息都存储在namenode的内存中)。对于每个块,namenode都返回该块的所有副本对应的datanode地址,在真正读取的过程中,这些datanode根据他们与客户端的距离来排序,使用距离最近的那个datanode上的副本
3、得到FSDataInputStream对象后,封装一个DFSInputStream对象,DFSInputStream随即连接距离最近的datanode。该对象的功能是管理者datanode和namenode的IO通信,并且也存储着文件的起始块。
4、FSDataInputStream反复调用read方法,将数据从datanode传输到客户端。
5、当到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳的datanode。
6、读取完毕,DFSInputStream调用close方法关闭RCP通信
注:如果DFSInputStream与datanode通信时遇到错误,会尝试从距离次佳的datanode读取数据,并记录那个发生故障的datanode以保证以后不会反复读取该节点上的后续的块。
二、HDFS读文件过程
1、客户端通过调用DistributedFileSystem的实例对象FileSystem的create方法来新建文件。
2、DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件信息的记录,这个时候,该文件中还没有分配相应的数据块。
3、新建如果成功,就会返回FSDataOutputStream对象,该对象继而封装一个DFSOutputStream对象。
4、DFSOutputStream维护着一个内部的数据队列和一个确认队列。在写入数据时,DFSOutputStream将数据分成一个个数据包写入数据队列,
5、DataStreamer处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据副本,这个datanode列表是一个数据块的存储位置,是为了备份数据。假如列表中有三个节点,DataStreamer就会把数据包传输到第一个datanode,该datanode存储数据包并将它发送到第二个datanode,第二个datanode存储数据包并转发到第三个datanode。
6、当一个数据包存储完毕,datanode就会发送确认回执到DFSOutputStream的确认队列中,当收到所有的确认后,该数据包就会被删除。
7、写入完成后,FSDataOutputStream调用close方法。