版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a909301740/article/details/84454520
一、客户端发出下载文件的请求
客户端执行hdfs dfs -get /movie/a.avi
命令请求 HDFS 下载文件到本地。
二、DFSClient 接收请求,创建 DistributedFileSystem 对象
DFSClient 接收下载文件的请求,并且创建 DistributedFileSystem 对象。
三、DistributedFileSystem 建立与 NameNode 的 RPC 通信,得到 NameNodeProxies
DistributedFileSystem 建立与 NameNode 的 RPC 通信,并且得到 NameNode 的代理对象 NameNodeProxies。
四、DistributedFileSystem 通过代理对象获取文件的元信息
DistributedFileSystem 通过代理对象去 HDFS 上查找文件的元信息。
五、在内存中查找文件的元信息
数据的元信息是优先存储在内存中的,所以 NameNode 会优先去内存中查找。
为了保证元信息的查找速率,通常我们会使用 NameNode 的联盟对内存容量进行扩展。
六、在 fsimage 文件中查找文件的元信息
如果在内存中找到了元信息,就直接返回,在内存中没有找到就会去 fsimage 文件中查找。
七、返回文件的元信息
NameNode 将找到的元信息返给 DFSClient。
八、创建输入流 FSDataInputStream
DFSClient 创建 FSDataInputStream 对象建立与 HDFS 的 IO 流。
InputStream in = client.open(new Path("/tools/stt.txt"));
九、下载数据块
通过 IO 流循环去 DataNode 下载数据。
HDFS 会维护一个 DataNode 的失败列表,记录哪些 DataNode 坏掉了,客户端在访问数据的时候就不会去这些 DataNode 上访问。