HDSF读数据
流程步骤
-
客户端向namenode发送请求,确定block在datanode上的位置。
-
namenode接收到请求后会判断是否有读数据的权限,再根据情况来返回部分或者全部的block列表且返回datanode地址。
-
这些返回的datanode地址,会根据网络拓扑关系得出datanode和客户端的距离,然后进行排序。
-
客户端会选择靠前的datanode来读取数据,如果客户端本身就是datanode,那么将从本地直接来获取数据。
-
当读完数据列表后,若文件读取还没有结束,客户端会继续向namenode获取下一个block列表和datanode地址,直到所有数据读取完毕。
-
最后将读取的数据进行排序,形成最终文件。
HDFS写数据
流程步骤
-
首先客户端向namenode发送写数据的请求,namenode接收到请求,需要判断是否有权限和目标文件是否存在,返回客户端是否可以上传,
-
接着客户端会向namenode询问block传输到哪些datanode上,namenode根据副本机制(一般默认为3副本策略)、网络拓扑关系、机架感知原理来进行分配。
-
客户端请求第一台上传数据,第一台收到请求继续调用第二台,以此类推,形成一个管道,后逐级返回客户端。
-
此时客户端向第一台上传block块,以64k的包为单位,第一台传给第二台,以此类推
-
数据被分割成数据包在管道上依次传输,在反方向上,逐个发送ack校验,最终由第一个datanode将ack发送给客户端
-
当一个block块传输完毕后,客户端会再向namenode请求下一个block的存放位置,直到所有的块传输完毕。