1,客户端发起RPC请求到NameNode,这个请求包含对文件信息的描述,
2,NameNode收到请求之后,校验这个用户的权限,如果校验通过,则会检查这个路径下是否有同名文件,如果没有同名文件,如果没有同名文件,则给客户端做一个回复,允许写入
3,NameNode计算这个文件需要切多少块,计算这个文件需要的地址数量,然后给每一块分配对应的地址,比如说机架感知策略,每一个DataNode上面的数据块信息,将这些地址放入队列中返回给客户端,因为每块有三个复本存着,假如分了7块,就有3*7=21个地址,
4,客户端在收到地址之后准备写入:客户端和DataNode单独建立联系,他们之间建立管道pipeline,客户端会将数据封包(封成一格格的packet,一个packet默认64K,管道用packet传递),写入到DataNode
5,在写的时候,从分配的地址中选取一个较近的节点,将数据写入.在写完一个block的第一个复本之后,这个DataNode自动通过pipeline(管道,实际上基于NIO的channel)将这个复本备份到其他节点(因为集群内部传输快,比你客户端找快)构成指定的复本数量,这里有个问题,这个DataNode他怎么知道应该被分到哪个节点,原因是客户端在找第一个DataNode时候,就告诉他另外两个复本的DataNodeip.
6,节点之间依次传递ACK信号,从第三台往前一次反馈,表示被分成功,在客户端收到ack信号,继续备份下一个block
ack信号指的是Acknowledge的简称,就是在bai数据通信中,接收站发du给发送站的一种传输类控制字符。表示zhi发来的数据已确认接收无dao误。