读入过程:
1.客户端通过RPC与Namenode通信,namenode返回一个输入流(FSDataInputStream对象)供客户端调用read方法不断读取数据。
2.输入流对象封装DFSInputStream对象,该对象管理着namenode和datanoded I/O,接着DFSInputStream连接到存储着所要读取的文件块的距离客户端最近的datanode的数据输出给客户端,读取完成后,继续寻找下一个数据块的datanode的位置。
3.在读取的过程中如果发生错误,则会DFSInputStream会尝试从另外一个邻近的datanode读取,同时记录这个出故障的datanode以此保证下一次不会再从故障的节点读取数据。
4.客户端获取数据完毕后调用FSDataInputStream的close方法关闭输入流。
写入过程:
1.客户端通过RPC与NameNode通信(FSDataInputStream),namenode确保客户端索要创建的文件是否存在,如果不存在在返回给客户端一个输出流,若文件已经存在则抛出异常;
2.客户端将文件切分成数据块,并将数据块放入输出流的一个队列(data quene)里面,同时从namenode中获取数据可存放的节点信息,数据开始在节点间存放(存放的节点通过一条管线连接)并复制副本到下一个节点直到副本复制完成,这时队列里的数据才会被清空,如果节点间副本复制失败,则有正常的节点之一通知namenode,此时namenode并不会寻找新的节点,而是继续写入下一个数据包并删除故障节点;
3.当数据包都写入完成后,客户端关闭数据流并等待namenode记录完数据包的副本文件位置后,删除说有数据包;
4.namenode会不断监测文件块的副本满足不满足副本数量条件,多删少补。