读流程
流程图如下:
- client通过分布式FileSystem.open(path)方法(其实就是传入路径,读的具体文件的路径),去与NN进行RPC通信,NN会校验路径是否存在 权限是否OK。
- 校验完成后,返回文件的部分或全部的block列表(其实就是返回FSDataInputStream对象)(假如块的数量比较多,那么可能先返回文件的部分块,等这一部分块读完之后,再继续返回其他的块)
- Client调用FSDataInputStream对象的read()方法:
a. 去与第一个块的最近的datanode进行read(是根据NN返回的地址列表去读的),读取完成后,会校验,假如OK,会关闭与当前的dn的通信。(每个块假如有三个副本,它会读离它最近的那个块的副本,而且只读其中的一个副本)。 假设check fail,会记录失败的块+DN信息,下次就不会读取了,那么会去这个块的第二个DN地址读取(也就是去读取这个块的第二个副本)
b. 然后读取第二个块的最近的datanode,check后,会关闭与DN的通信
c. 假设block列表读取完了,文件还没结束,就继续读取下一批次的block的列表。(备注:读的时候先读第一个块,再读第二个块,假如第一个块读的时候失败了,它会记录这个块所在的机器,下次就不会读了) - Client调用FSDataInputStream.close(),关闭输入流。(备注:整个过程是透明的无感知的)