HDFS读取文件步骤
- client调用FileSystem.open(),该FileSystem指向的实例是DistrbutedFileSystem(DFS),它通过RPC请求到Namenode.
- Namenode收到请求后,对于每一个块返回存有该副本的Datanode地址。并且依照“网络拓扑”来排序。(就近原则)
- DFS获取到BlockLocations后,可以根据当前读取偏移量计算指定DataNode并进行通讯,返回一个FSDataInputStream,该对象管理DataNode和NameNode的I/O, 客户端反复调用stream.read()方法获取数据 (这步包含了权威指南的3,4步骤)。
- 到达块的末端时,stream关闭与当前交互的DataNode的连接,继续寻找下一个最佳的DataNode再执行步骤3操作。
- client从stream读取数据时,块是按照打开stream和DataNode的顺序读取的,
它也会询问NameNode来检索下一批数据块DataNode的位置。(《权威指南第三版》76页倒数第4行描述有误,事实上一次性获取了完整的BlockLocations) 一旦client读取完成,就对stream执行close操作
上述流程是在正常读取,并且没有发生故障的理想情况下。
补充:
总结:
这个设计的重点是,NameNode告知客户端每个块中最佳的DataNode,并让客户端直接连接到该DataNode检索数据。由于数据流分散在集群中的所有DataNode,所以这种设计能使HDFS可扩展到大量的并发客户端。同时,NameNode只需要响应块位置的请求(这些信息存储在内存中,所以非常高效),无须响应数据请求,否则随着客户端数量的增长,NameNode会很快成为瓶颈。
版权声明:本文为博主原创文章,未经博主允许不得转载。