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()方法,关闭输入流
本文详细介绍了HDFS中客户端如何读取文件的过程。通过调用DistributedFileSystem.open方法,客户端能够从NameNode获取文件块信息,并直接从DataNode读取数据。当一个块读取完成后,客户端会检查读取状态并选择下一个块进行读取。

956

被折叠的 条评论
为什么被折叠?



