① 请求创建文件: 客户端向服务器发起上传请求(RPC)
② 执行检查,判断: 1. 目标文件是否存在2. 父目录是否存在3. 客户端是否具有操作权限
③ 反馈标记: 给客户端反馈是否可以上传标记
④ 切割: 客户端将要上传的文件按照片设置的Block大小进行切片
⑤ 请求上传Block: 客户端向NameNode请求上传第一个Block
⑥ 挑选主机: 收到上传Block的请求后,会根据副本放置策略和主机的优秀程度选出N台最优主机
⑦ 返回主机列表: 返回最优主机列表( node1, node2, nodeN … )
⑧ 建立pipeline: 客户端与拓扑距离最近的主机建立pipeline
⑨ 传输Block: 开始传输第一个Block,传输单位是package(64k)
⑩ 缓存package: 收到一个package就会缓存到内存中
11. 产生应答对列: 从最后一个DataNode开始,收到package,就会将一个ACK确认字符放入应答对列
12. 判断应答对列: 客户端判断应答对列中的ACK是否完整完整则判断此次package发送成功继续发送第二个
13. 落盘: 当最后一个package收到后DataNode会将缓存的所有package存储到硬盘上,也就是一个Block
14. 循环执行: 重新执行5-13步
15. 返回完成信息: 客户端向NameNode汇报文件上传完毕
16. 更新元数据: NameNode更新自己内存中的元数据
① 发起请求: 客户端向服务器发起下载请求
② 执行检查,判断: 1. 目标文件是否存在2. 父目录是否存在3. 客户端是否具有操作权限
③ 获取Block列表: NameNode获取文件的Block信息列表,并且对每一个Block的主机根据策略进行排序
Block1: node1 node3 node4
Block2: node1 node2 node4
Block3: node2 node3 node4
④ 返回Block列表: 将文件的Block列表发送给客户端
⑤ 建立管道: 客户端分别和三个Block所在的主机建立管道
⑥ 读取数据: 客户端分别从三台主机读取数据,并行执行,读取单位也是package(64k)
⑦ 合并Block: 客户端将三个Block进行合并组成文件(字节数组的合并)