HDFS文件读取:
- 客户端通过FileSystem对象(抽象类,一般通过这个来调用方法),open()方法打开需要读取的文件,HDFS中用DistributedFileSystem实现FileSystem的open()方法,通过远程调用(RPC)调用namenode,namenode告诉它存放该块复本的datanode地址
- datanode通过网络拓扑找到距离客户端最近的datanode并排序
- open()方法返回一个FSDataInputStream对象,客户端对FSDataInputStream的read()用来找到对应的最佳datanode,通过反复调用read()将结果告诉给客户端,到达块的末端时断开datanode之间的连接,再去找下一块的最佳datanode
- 最后,客户端调用FSDataInputStream close()完成数据读取
- 客户端读取HDFS文件系统中的数据图:
- 用API写个简单的文件读取例子
@Test
public void openTest() throws Exception {
FSDataInputStream in = fileSystem.open(new Path("/hdfsapi/test