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方法,关闭输入流。

发现复本两不足时,会在另一个节点创建一个新的复本;

 

posted @ 2020-06-25 11:21  夏天换上冬装  阅读(134)  评论(0编辑  收藏  举报