HDFS读写流程
写流程
1.HDFS Client调用DistributedFileSystem.create(filePath)方法,去和NN进行【RPC】通信!
2.NN 会去check这个路径的文件是否已经存在,是否有权限能够创建这个文件!
假如都ok,就去创建一个新的文件,但是这时还没写数据,是不关联任何的block。
返回输出流 FSDataOutputStream,,封装了输出流 DFSOutputDtream。
3.Client 调用【FsDataOutputStream】对象的write方法,
根据【副本放置策略】,将第一个块的本身写到DN1,写完复制到DN2,再写完复制到DN3.
当三个副本写完的时候,就返回一个ack package确认包给DN2,DN2接收到确认包加上自己也写完了;
4.当所有的块全部写完,Client调用【FsDataOutputStream】对象的close方法,关闭输出流。
再次调用FileSystem.complete方法,告诉NN文件写成功。
读流程
1 Client调用FileSystem的open(filePath),与NN进行【RPC】通信。
返回这个文件的部分或者全部的block列表,
也就是返回【FSDataInputStram】对象。
2 Client调用【FSDataInputStram】对象的read方法,
去与第一个块的最近的DN的进行读取,读取完成后会校验,假如ok就关闭与DN通信。
假如不ok,就记录块和DN的信息,下次就不从这个节点读取,那么从第二个节点读取。
然后与第二个块的最近的DN进行读取,以此类推。
假如当block的列表全部读取完成,文件还没结束,再去NN请求下一个批次的block列表。
3 Client调用【FSDataInputStram】对象的close方法,关闭输入流。
发现复本两不足时,会在另一个节点创建一个新的复本;