HDFS的写数据流程
1、客户端通过Distributed FileSystem模块向NameNode发送请求,请求上传文件/user/atguigu/ss.avi
2、NameNode检测是否有目录,文件是否存在;检查完毕后,响应客户端可以上传文件
3、一个块是128M,上传的文件为200M;客户端向NameNode请求上传第一个block(0-128m),询问上传到哪个DataNode节点
4、NameNode根据客户端和DataNode节点之间的距离和以及DataNode负载情况,返回DataNode节点
5、客户端通过FSDataOutputStream模块向各个节点请求上传数据,建立Block传输通道
6、各个节点应答客户端
7、客户端通过输出流的方式,以Packet的形式向DataNode节点传输数据,数据一开始存在内存(队列)中,然后序列化到本地;一个DataNode完成后,再把内存中的数据传给另一个DataNode;全部DataNode完成,给客户端一个应答,然后清空内存中的数据。
8、当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器(剩下的72m)。(重复执行3-7步)
9、最后关闭资源,告诉NameNode数据上传完成
补充:计算节点距离
客户端向HDFS上传数据时候,NameNode如何计算哪个节点离客户端最近呢?
首先,要知道什么是节点距离。
节点距离:两个节点到达最近的共同祖先的距离的和(共同祖先可以近似理解为路由)
如上图所示,一个机房C1有2个集群d1和d2.每个集群又有3个机架和9个节点
1、/d1/r1/n0 --> /d1/r1/n1:它们的共同祖先是r1。n-0到r1的距离为1,n-1到r1的距离也为1,所以他们之间的距离为2
2、/d1/r1/n0 --> /d1/r2/n1:它们的共同祖先是d1。n-0到r1的距离为1,r1到d1的距离为1;同理,n-1到r2的距离为1,r2到d1的距离为1;所以他们之间的距离为4
3、节点到自己的距离为0
学会计算节点之间的距离之后,我们看一个案例。
假设副本为3;客户端在/d1/r1/n0节点上向NodeName发送了上传数据的请求,由于它自身就是DataNode,和自己的距离最近,距离为0。NodeName选择它作为一个DataNode,另外两个副本的选择参考下面的”副本节点的选择”
副本节点的选择
假设有上述一个集群,设置的副本数量为3.
- 第一个副本节点:就是客户端所在的节点;如果客户端不在集群上,则随机选择一个
- 第二个副本节点:在第一个副本节点的机架上,随机选择一个节点
- 第三个副本节点:在其他机架上随机选择一个节点