HDFS读流程图
假设需要读取HDFS根目录下的bigdata.log文件,使用如下命令
hadoop fs -cat /bigdata.log
整个流程如下:
1、客户端会调用DistributedFileSystem.open方法与NameNode进行RCP通信,NameNode会返回该文件的部分或全部的 block列表(也包含该列表各block的分布在Datanode地址的列表),也就是返回FSDataInputStream对象
2、客户端调用FSDataInputStream对象的read()方法
a、会去与第一个块的最近的datanode进行read,读取完后,会check,假如successful,会关闭 与当前 Datanode通信;(假如check fail,会记录失败的块+Datanode信息,下次就不会读取;那么会去该块的第二个 Datanode地址读取)
b、 然后去第二个块的最近的Datanode上的进行读取,check后,会关闭与此datanode的通信。
c、 假如block列表读取完了,文件还未结束,那么FileSystem会从Namenode获取下一批的block的列表。
3、客户端将文件块读取完整后,会调用FSDataInputStream.close()方法,关闭输入流