先来一张图展示hdfs读流程 hsdf -dfs -ls /
1.client端通过FileSystem.open(path)方法,和namenode通过rpc进行通信,namenode校验路径是否存在,用户是否有权限
2.验证完成后,返回文件的部分或者全部的block列表(其实就是返回FSDataInputStream对象)
3.client调用FSDataInputStream对象的read方法,与第一个块block所在的最近的datanode进行通信,read块内容,读取完成后,会校验,假如成功,会关闭与当前的datanode的通信。
4.然后接着与第二个快block所在的最近的datanode进行通信,read块内容,读取完成后,校验成功,会关闭与datanode通信。
5.因为FileSystem.open(path)返回的block列表是一批一批的,假如当前block列表读完,文件还没有结束,就会继续读取下一批次的block列表。重复执行2、3步骤。
6.当文件读完之后,client会调用FSDataInputStream.close(),关闭输入流。hdfs读流程结束。