看了一上午,终于找到了HDFS写一个新的block做了个啥。
DFSClient传数据最终是在DFSOutputStream中完成的。它内部的DataStreamer来完成真正的传输工作。
1.setup stream
nextBlockOutputStream
locateFollowingBlock调用namenode.addBlock向NN申请新的block,那么弄得会返回一个新的block,这时候block所在的datanode还不知道这个block的存在。createBlockOutputStream建立和第一个datanode的通信
setupPipelineForAppendOrRecovery
调用namenode.updateBlockForPipeline更新block信息
createBlockOutputStream建立和第一个datanode的通信
后面传数据就不用参考了
datanode接到数据后的处理,主要在BlockReceiver.java中完成,看一下receiveBlock()函数。