ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
:-: ![](https://img.kancloud.cn/ec/ff/ecff7985d4b12fc628d2341a503b6a97_816x493.png) HDFS读流程 1. 首先调用 FileSystem.open()方法,获取到 DistributedFileSystem 实例。 2. DistributedFileSystem 向 Namenode 发起 RPC(远程过程调用)请求获得文件的开始部分或全部 block 列表,对于每个返回的块,都包含块所在的DataNode 地址。这些 DataNode 会按照 Hadoop 定义的集群拓扑结构得出客户端的距离,然后再进行排序。如果客户端本身就是一个 DataNode,那么他将从本地读取文件。 3. DistributedFileSystem 会向客户端 client 返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据。FSDataInputStream 包含一个DFSInputStream 对象,这个对象用来管理 DataNode 和 NameNode 之间的 I/O。 4. 客户端调用 read()方法,DFSInputStream 就会找出离客户端最近的datanode 并连接 datanode。 5. DFSInputStream 对象中包含文件开始部分的数据块所在的 DataNode 地址,首先它会连接包含文件第一个块最近 DataNode。随后,在数据流中重复调用 read()函数,直到这个块全部读完为止。如果第一个 block 块的数据读完,就会关闭指向第一个 block 块的datanode 连接,接着读取下一个 block 块。 6. 如果第一批 block 都读完了,DFSInputStream 就会去 NameNode 拿下一批blocks 的 location,然后继续读,如果所有的 block 块都读完,这时就会关闭掉所有的流。<br/> 注意:NameNode 只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据。最终读取来所有的 block 会合并成一个完整的最终文件。