1、客户端向namenode请求上传文件,namenode在元数据中查找是否满足上传条件(路径是否存在,文件是否存在等)
2、元数据系统返回信息告知客户端,可以上传文件
3、RPC请求上传第一个block(0-128M),请求返回datanode
4、元数据系统向客户端返回若干个datanode(因为一块block有好几个副本),
选择datanode考虑因素为datanode的空间和客户端到datanode网络跳转的级数(是否一个机架(路由器)),
比如 如果有三个datanode,选取第一个datanode的时候如果空间和距离相近,那就随机选择一台,
第二台选择远的,选择第二台机架(安全),第三台和第一台一样。
5、客户端请求第一台datanode建立block传输通道,并告之还要请求第二台第三台,第一台向第二台发出请求建立通道,
第二台向第三台请求建立通道,第三台机器启动本地流,向第二台机器做出相应,第二台向第一台应答,
第一台向客户端做出应答,客户端已一个一个小数据包(packet 64k),向第一台机器发送
第一台在向本地写数据之前要做验证,在客户端文件到第一台之间会有缓冲,缓冲一边向第一台写数据,一边向第二台发送
6、只要第一台上传成功客户端就认为成功了,及时第二台第三台失败,namenode 最后会异步对 数据进行复制
7、如果第一台就上传失败,namenode会重新匹配datanode 会连接三次
8、第二个block和上面的步骤一样