Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path file = new Path("demo.txt"); FSDataInputStream inStream = fs.open(file); String data = inStream.readUTF(); System.out.println(data); inStream.close();
1. 首先,客户端通过 DistributedFileSystem 向 NameNode 请求下载文件。
2.NameNode 收到请求之后会检查用户权限以及是否存在这个文件,如果符合则会返回目标文件的元数据给客户端。
3. 接着,客户端调用 FSDataInputStream 的 read()方法开始请求读取数据。客户端会挑选一台最近的 DataNode 来读取数据,如果客户端本身就是 DataNode,那么将从本地直接获取数据。
4.DataNode 开始传输数据给客户端,每传输完一个 block 都会进行 checksum 验证(以 Packet 为单位来做校验),当此数据块读取完毕时,FSDataInputStream 会关闭和此数据结点的连接,然后连接此文件下一个数据块的最近的数据节点。
5. 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。
6. 当客户端读取完毕数据的时候,会调用 FSDataInputStream 的 close()方法关闭流对象。
6. 在读取数据的过程中,如果客户端在与数据节点通信时出现错误,客户端会通知 Namenode,并尝试连接包含此数据块的下一个数据节点,失败的数据节点会被记录,此后不再连接。。
读数据流程视频讲解:58_尚硅谷_Hadoop_HDFS_读数据流程_哔哩哔哩_bilibili