写文件流程
1.客户端会根据RPC协议,向namenode发出请求上传文件的要求。
2.namenode根据请求检查元数据,判断客户端是否具有上传的权限。
3.如果有权限,向客户端发送可以上传的命令。
4.客户端会将想要上传的文件按照HDFS的block大小进行切割。再次向namenode发送请求上传block-1 3个副本(HDFS副本存储策略设定的数量)的指令。
5.namenode会根据datanode汇报的信息(健康状况(心跳机制)、磁盘使用情况(块汇报机制))找出3台可用的位置。
6.namenode将找出的3台可以存储3个副本的位置(datanode1、datanode2、datanode3)信息发送给客户端。
7.客户端向距离最近(网络拓扑图中的远近)的位置(datanode1)建立pipeline管道(即:IO),建立完成后,datanode1会和datanode2建立管道,建立完成后,datanode2会和datanode3建立管道。
8.都建立完成后,datanode1会向客户端建立完毕的命令。
9.客户端开始读数据,数据会以64K的数据包(packet)在管道里传输。
10.datanode1会接受packet数据,保存至本地文件系统中后,继续向后续的节点(datanode2、datanode3)推送这个数据包,同时会向客户端发送一个ACK应答相应校验。datanode2同样接受这个数据包保存至本地文件系统中,向datanode3继续推送这个数据包,同时会向datanode1发送一个ACK应答相应校验。最终datanode3接受保存完这个数据包后,再向datanode2发送一个ACK应答相应校验。
11.当block-1 3个副本数据都传输完成后,从第四步开始继续发送请求上传block-2 3个副本... 的指令。
12.当所有的数据块上传完毕后,客户端会通知namenode写完成,namenode会同步文件的元数据信息。
读流程
1.客户端向namenode发送请求下载文件的命令.
2.namenode根据请求检查元数据判断客户端是否有权限下载,有的话,会视情况(根据文件的大小)分批次返回数据块的信息(这些信息是排序好了的,近的在前,状态差的靠后)。
3.客户端连接到第一个数据块进行读数据,在读取完毕之前,连接到第二个块。
4.连接到第二个数据块进行读数据。
5.如果文件比较大,还有数据块,客户端继续下一批次的读取。
6.最后,客户端会将数据块按照编号进行追加(有一个CRC循环冗余码的校验)。