太长不看版
1、写入(create)创建DFSOutputStream,启动DataStreamer线程run (主线程)
2、setPipeline -> nextBlockOutputStream -> locateFollowingBlock(addBlock)
2、createBlockOutputStream (client -> dn1 -> dn2 -> dn3)启动blockStream(实际用来写数据)
4、new ResponseProcessor 并启动线程run
5、按照packet粒度发送 packet 到datanode
a、writeChunk -> waitAndQueueCurrentPacket -> dataQueue
b、DataStreamer run方法不断从dataQueue队列take出来发送
c、收到ack后放入ackQueue
6、写完一个block 后endBlock -> 关闭response 线程 -> 关闭blockStream 线程
7、写下一个block 重复2 - 6
8、complete
一、总体流程
1、客户端向NameNode发出写文件请求。
2、检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。
(注:WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了,
由于在真实写操作之前,操作就被写入EditLog中了,故EditLog中仍会有记录)
3、client端按128MB的块切分文件。
4、client将NameNode返回的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和多个DataNode构成pipeline管道。
client向第一个DataNode写入一个packet,这个packet便会在pipeline里传给第二个、第三个…DataNode。
在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点将ack发送给client。
5、写完数据,关闭输输出流.
6、发送完成信号给NameNode。
二、代码细节
1、创建文件
通常情况下,我们在创建文件的时候会新建