1. HDFS写流程
(1)HDFS客户端通过对DistributedFileSystem对象调用create方法发送创建文件请求,DistributedFileSystem通过RPC调用与NameNode建立通信(对NameNode进行RPC调用),请求上传文件。NameNode执行各种检查判断,包括目标文件是否存在,父目录是否存在,客户端是否具备创建该文件的权限等。如果满足返回给客户端可以上传的信息;
(2)客户端根据文件大小进行切块,块大小默认128M,切分完之后给NameNdoe发送请求第一个block块上传到哪些服务器上;
(3)NameNode收到请求后,根据网络拓扑、机架感知以及副本策略(默认3副本策略,第一块副本:优先客户端本地,否则随机;第二块副本:不同于第一块副本的不同机架;第三块副本:第二块副本相同机架不同机器)进行文件分配,返回可用的DataNode的地址列表(A,B,C);
(4)客户端收到地址列表后先与列表中的A通过RPC进行通信,建立管道,A收到请求后后继续调用B,B在调用C,这样整个管道建立完成,逐级返回给客户端;
(5)客户端开始向A上发送第一个block(先从磁盘读取数据然后放到本地内存缓存),DFSOutputStream以packet为单位进行传输,大小64KB,A接收到一个packet会发送给B,B再发送给C,其中A每传完一个packet就会放入一个应答队列等待应答;
(6)数据被分割成一个个的packet数据包在管道上依次传输,然后通过管道反向传输,逐个发送ack(命令正确应答),最终由管道中的第一个DataNode节点A将应答发送给客户端;
(7)当一个block块传输完成后,客户端再次请求NamNode上传第二个block,重新执行(3)-(6)。
2. HDFS读流程
(1)客户端向NamNode发送RPC请求,请求文件的block块所在位置;
(2)NameNode收到请求后会检查用户权限以及是否有这个文件。两者都满足,则会视情况返回部分或全部的block列表,针对每个block块,NameNode都会返回含有该block副本的DataNode地址。返回的DataNode地址,会按照集群拓扑结构计算得出DataNode与客户端的距离,进行排序。排序遵循两个原则,一是网络拓扑结构中距离客户端近的排前面,二是心跳机制中超时汇报的DataNode状态为STALE的排后面;
(3)客户端选取靠前的DataNode来读取block块,如果客户端本身就是DataNOde,则从本地直接读取数据;
(4)当读完列表的block后,若文件还没有结束,客户端会继续向NamNode获取下一批的block列表;
(5)读取完的block块都会进行校验和验证,如果读取DataNode时出现错误,客户端会通知NameNode,从下一个拥有block副本的DataNode继续读;
(6)read方法是并行的读取block信息,不是一块一块的读取;NameNode只是返回客户端请求包含块的DataNode地址,并不是返回请求块的数据;
(7)最终读取来所有的block会合并成一个完整的最终文件;