社区版Hadoop 1.0.0中对HDFS append操作进行了重新设计和实现,解决了之前append操作实现的很多缺陷。下图是对HDFS append操作详细的一般分析,该操作涉及到client,namenode和datanode的很多交付,可见其复杂性。
![](http://hi.csdn.net/attachment/201203/5/0_1330933077L666.gif)
从Client角度来看,append一个文件首先需要调用DistributedFileSystem的append操作,该操作会返回一个FSDataOutputStream的流对象out,Client要向该文件append数据,可以调用out.write写入数据,最后调用out.close进行关闭。但是其内部的交互流程比较复杂,下面我们从上述三个client端的调用来进行逐一深入分析:
1. client调用fs的append操作:
1.1 首先调用namenode的getFileInfo RPC调用,获取该文件的信息
1.2 调用namenode的appendFile RPC调用,进行lease的检查(是否可以append,如果已经被别的client在append了,就不能再进行append),将该文件从INodeFile转换从INodeFileUnderConstruction,并且将该文件的最后一个Block以LocatedBlock的对象返回给Client。如果没有则返回null。注意,上述的流程图表示的是要append的文件之前已经成功关闭并且是一个IN