HDFS客户端写流程
1.创建文件
首先调用DistributedFileSystem.creat()创建一个空的HDFS文件。
然后这个方法在底层会通过调用ClientProtocol.create()方法通知Namenode执行对应的操作,Namenode会首先在文件系统目录树中的指定路径下添加一个新的文件,然后将创建新文件的操作记录到editlog中。
调用的DistributedFileSystem.creat()方法会返回一个HdfsDataOutputStream对象,这个对象在底层包装了一个DFSOutputStream对象,用以执行写数据操作
2.建立数据流管道
DFSOutputStream首先会调用ClientProtocol.addBlock()方法向Namenode申请一个新的空数据块,addBlock()方法会返回一个LocatedBlock对象,这个对象保存了存储这个数据块的所有数据节点的位置信息。
获得了数据流管道中所有数据节点的信息后,DFSOutputStream就可以建立数据流管道写数据块了。
3.通过数据流管道写入数据
写入DFSOutputStream中的数据会先被缓存在数据流中,之后这些数据会被切分成一个个数据包通过数据流管道发送到所有数据节点。每个数据包都有个确认包,确认包会逆序通过数据流管道回到输出流。输出流在确认了所有数据节点已经写入这个数据包之后,就会从对应的缓存队列删除这个数据包。当客户端写满了一个数据块之后,会调用addBlock()申请一个新的数据块,然后循环执行上面的操作
4.关闭输入流并提交文件
调用close()方法关闭输出流,并通知Namenode提交这个文件中的所有数据块。