HDFS读/写数据的流程

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.
  • 第一个副本节点:就是客户端所在的节点;如果客户端不在集群上,则随机选择一个
  • 第二个副本节点:在第一个副本节点的机架上,随机选择一个节点
  • 第三个副本节点:在其他机架上随机选择一个节点

HDFS的读数据流程

在这里插入图片描述

1、客户端通过DistributedFileSystem向NameNode请求下载文件
2、NameNode返回要下载文件的元数据信息(包括文件存储在哪个DataNode等)
3、客户端向距离最近的DataNode读取Block1
4、DataNode传输数据给客户端(客户端从磁盘里读取输入流,也是以Packet),上述流程存在问题,因为Bolck1和Block2都存在一台机器上,客户端在读取完Block1之后,会直接读取Block2;除非当前DataNode的Block2损坏,才会随机读取其他DataNode的Block2
5、两个Block读取完成后,客户端将其合并成所需的文件,最后关闭资源
备注:如果文件的块不在同一个DataNode上面,先按就近原则,然后随机;串行读取,一个Block读取完,才读取另一个,并不是并行读取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值