客户端除了可以执行写入新的HDFS文件操作外,还可以打开一个已有文件并执行追加写操作,下面是追加写的几个步骤
-
打开已有的HDFS文件
客户端首先调用DistributedFileSystem.append()方法打开一个已有的HDFS文件,append()方法会先调用ClientProtocol.append()方法获取文件最后一个数据块的位置信息,如果文件的最后一个数据块已经写满则返回null。然后append()方法会调用DFSOutputStream.newStreamForAppend()方法创建到这个数据块的DFSOutputStream输出流对象,获取文件租约,并将构建的DFSOutputStream方法包装为HdfsDataOutputStream对象,最后返回
-
建立数据流管道
DFSOutputStream类的构造方法会判断文件最后一个数据块是否已经写满,如果没有写满,则根据ClientProtocol.append()方法返回的该数据块的位置信息建立到该数据块的数据流管道,如果写满了,则调用ClientProtocol.addBlock()向Namenode申请一个新的空的数据块之后建立数据流管道
-
通过数据流管道写入数据
成功地建立数据流管道后,HDFS客户端就可以向数据流管道写数据了,这部分内容与上篇写HDFS文件流程类似
-
关闭输入流并提交文件
与上篇写HDFS文件流程类似,当HDFS客户端完成了追加写操作后,需要调用close()方法关闭输出流,并调用ClientProtocol.complete()方法通知Namenode提交这个文件中的所有数据块
可以看到,HDFS客户端追加写流程与写流程是很类似的,只不过在初始建立数据流管道时有些不同