目录
一、读操作图解:
二、工作原理:
1、客户端通过调用FileSystem对象的open()方法期望打开指定的文件。
注:实际上,对于HDFS来说,真正实际的对象是DistributedFileSystem,此对象通过使用RPC(远程过程调用)来调用namenode,来确定文件起始块的位置。
2、向namenode发送读取指定文件的请求,以求得到块中元数据的信息。
3、namenode如果找到元数据的信息,就会返回目标文件的元数据信息
注:对于每一个块,namenode返回存有该块副本的datanode的地址,并根据距离客户端的远近来排序。
4、同时DistrbutedFilesystem对象会返回一个名为FSDataInputStream的对象。
注:FSDataInputStream对象支持文件定位功能,支持客户端通过输入流读取数据
5、客户端对这个输入流调用read方法。
6、FSDataInputStream对象通过地址找到距离最近文件的块所在的datanode。
7、然后通过调用read方法,将数据从datanode返回到客户端。
注:
- 读取到块的末端时,FSInputstream关闭与该datanode的连接,然后寻找下一个块的最佳datanode
- 客户端从流中读取数据时,块均是按照FSInputStream与Datanode新建连接的顺序读取的
8、客户端将block1的数据写入到本地文件中。
9、继续读取block2的数据。
10、将block2的数据传回客户端。
11、将block2的数据追加到block1的后面。
12、客户端完成读取,客户端对FSInputstream调用close方法关闭流。
注意点:
- 在读取数据的时候,如果FSInputStream与DataNode通信时遇到错误,会尝试从这个块 的最近的DataNode读取数据,并且记住那个故障的DataNode,保证后续不会反复读取该节点上后续的块。
- FInputStream也会通过校验和确认从DataNode发来的数据是否完整。如果发现有损 坏的块,FSInputStream会从其他的块读取副本,并且将损坏的块通知给NameNode