HDFS写流程
1.客户端(client)会先和NameNode联系,在NameNode虚拟目录下创建文件(没有创建有的话就不能上传了这个过程是在Path路径进行检查的)。这个过程是可以看见的显示copying这时文件是不能读取的,NameNode会根据副本放置策略分发副本(第一个在本机架另外两个在其他机架)NameNode会把这三个节点的位置返回给客户端。如果客户端在集群外namenode会根据策略先找一个机架放datanode在另外机架上放置另外两台datanode,namenode会让他们之间建立一定联系组建一个顺序。
2.客户端会根据返回的三个节点跟第一个节点建立关系socket链接(只跟第一个节点建立)然后第一个在和第二个进行socket链接第二个和第三个进行socket链接这个链接叫做Pippeline(管道)也就就是one by one 一个接着一个。
3.文件传输的切片大小是64M或者是128M,我们把这个块自定成更小的包来传输这样可以在客户端给第一个 传输的时候第一个给第二个也在传输以此类推像流水线一样这样可以提高工作效率这个方式可以叫做:充分利用了时间线的重叠,就是在你给我的时候我也在给别人。也间接的说明给一个副本传完其他的也有了。
4.datanode在namenode中的三个位置的由来
namenode和datanode本来保持这连接,在客户端通过Pipeline传输完数据打他node就会把自己的位置发送给namenode。这个过程是系统自带的,并且这个过程是在客户端给其他块传输数据时完成的非常快。
5.如果在传输的过程中datanode挂掉了就直接记录并上传信息继续向其他 节点传输不影响速度。
过程如图:
HDFS读流程1.读流程时有距离优先,比如读文件的时候可以 获取三个位置信息它会先读取在自己的节点上的副本如果不成功再继续向下一个读取,以此类推。
2.下载文件的时候是把文件切分成块的所以可以选 着块来读取,可以第一个到最后一个也可以是其中的一段或一个。选择根据距离排好序的副本,最终客户端可以根据namenode给的数据间接达到本地化读取。客户端可以是人为的下载文件也可以是计算框架,所以根据排好序的块读取计算间接的等于本地化读取。
3.计算向数据移动是:其实块的位置信息才是支持计算向数据移动的位置信息找到某个节点从而找到这个块也就是数据。