#FSDataInputStream封装了DFSInputStream
大部分的HDFS程序对文件操作采用的是“一次写多次读取”的模式。
1.HDFS客户端先向DFSInputStream发起创建文件请求,创建输出流。DFSInputStream对想象中的Create()函数创建一个文件。
2.DistributedFileSystem输出流要执行RPC远程调用名称节点,让名称节点在文件系统空间中创建一个新文件。但名称节点不会直接创建一个新的文件,名称节点先要观察所要创建的文件是否已存在,还要观察所写文件是否有权限才能创建新文件。
3.名称节点反馈给客户端节点,HDFS向FSDataInputStream创建数据流写入数据。写入数据的方式是流水线复制,流水线复制就是把整个数据分成一个一个分包,这些分包分别放到DFSDataOutputStream这个对象的内部队列。DFSDataOutputStream向名称节点申请保存这些数据块的数据节点。
4.申请到后名称节点会告诉客户端节点应该把数据包写到哪些数据节点上。把要写入的数据节点排成队列,这些数据节点会形成一个数据流的管道。把刚才的分包在打包成分包成数据包把它发到整个数据流通道的第一个节点,第一个再把数据包发到第二个以此类推,形成流水线。
5.接收确认数据包不是各个节点直接发到客户端节点上的,而是写入数据包的最后一个数据节点发给前面的节点以此类推,到第一个节点把整个确认包发送给数据端节点。
6.关闭文件。
7.写操作完成。