HDFS写数据流程
总体流程:
客户端通过对DistributedFileSystem对象调用create()来新建文件,DistributedFileSystem对NameNode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块,NameNode执行各种不同的检查以确保这个文件不存在以及客户端有新建改文件的权限。
如果这些检查均通过,NameNode就会为创建新文件记录一条记录,否则文件创建失败,并向客户端抛出一个IOException异常,DistributedFileySystem向客户端返回一个FSDataOutputStream对象。
由此客户端可以开始写入数据,写入数据时,DFSOutputStream将它分成一个个的数据包(packet),并写入内部队列,称为"数据队列"。DataStreamer处理数据队列,它的责任是挑选出适合存储数据副本的一组DataNode,并要求NameNode分配数据块,这一组DataNode就构成了一个管线(假设副本数为3),即管线中有三个节点,DataStreamer将数据包流式传输到管线中第一个DataNode,该DataNode存储数据包并将它发送到管线中的第二个DataNode,同样,第二个再发给第三个。
DFSOutputStream也维护这一个内部数据包队列来等待DataNode的收到确认回执,称为“确认队列”(ack queue)。收到管道中素有DataNode确认信息后,该数据包会从确认队列中删除。