hdfs文件的读取过程
8、HDFS的文件读取过程
详细步骤解析
1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
3、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
4、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
5、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
6、 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
7、 read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
8、 最终读取来所有的 block 会合并成一个完整的最终文件。
====
我做的笔记:
hdfs文件的读取过程
第一步:客户端请求namenode需要读取一个文件。
第二步:namenode校验客户端的权限问题以及文件是否存在等问题。如果校验不通过,直接给客户端抛异常即可。如果校验通过,namenode会返回给客户端这个文件的部分或者全部的block块列表。
第三步:客户端拿到部分或者全部的block块列表之后,开始与datanode进行通信。
第四步:客户端可以开启多线程与datanode进行通信。与datanode建立连接之后,开始读取数据。
第五步:所有的block块全部读取完成之后,客户端将所有的block块进行拼接,形成一个完整的文件。
注意:读取效率比写入效率要高。因为block块数据写入是串行的,但是block块数据的读取是并行的。
问题:如果读取的时候,出错了怎么办?
回答:客户端通知namenode重新获取对应的block块的地址,重新读取。
寻找block块的依据:1.离客户端比较近的。2.比较鲜活的datanode(短路读取特性)。