1:HDFS写入数据的流程(如何在客户端把数据写入到HDFS集群)
1:首先客户端向NameNode发送上传请求
2:NameNode检查客户端所传递的用户以及权限问题,还有是否存在等问题,如果均满足,则响应客户端可以上传问题
3:客户端请求上传地址,即上传第一个块的地址,返回指定的DataNode
这种副本存储节点的选择有如图上的三种节点,应该是负载均衡方面的考虑。
4:NameNode返回节点,表示采用这几个节点存储数据
5:客户端创建写数据流,客户端不是同时对应多个DataNode,因为如果其中任意一个数据没有传输完毕,客户端都需要等待,所以采用如图的建立通道的方式,进行依次传输。
6:之后再依次应答。
7:传输数据,不是一次性全传入,而是假如说一个时间段,传入10M数据,有一半时写入到DataNode,另一半直接继续往后传输。传出的最小单位时64k,取名packet。数据的格式内容是先生成512字节的chunk,然后再加上4字节的校验位,形成多个之后,然后共同再形成packet。其实还有一个ack队列,保证全部应答成功,防止部分未传输完毕。
8:应答全部传输完毕之后,客户端向NameNode发送信号。
2:网络拓扑-节点距离计算
这个主要是服务于解决刚刚NameNode如何选择合适节点接收客户端传输数据的问题。
这个距离的计算就是数一共多少条线,找到两者的共同祖先。
3:机架感知(副本存储节点选择)
这个也是选择合适节点接收数据。
第一个节点一般都是选择本地,因为数据传的快。
第二个节点一般是放到其他机架上,保证数据的可靠性。
第三个节点一般和第二个放在同一机架不同节点,主要考虑传输效率问题。
4:HDFS的读数据流程
1:客户端创建分布式文件对象,由它来访问NameNode,请求下载文件
2:NamoNode判断用户存在与否以及所要下载的文件是否存在和用户是否由权限等问题,满足的话就访问允许元数据信息。
3:客户端创建读数据的流,考虑与自己最近的节点以及该节点的负载问题
4:客户端读取数据,是串行读的,并不是所有的块统一开始读取。