HDFS读写流程

HDFS读写流程

1、写数据流程

在这里插入图片描述
(1)写数据流程即从本地(客户端)写入HDFS,通过创建Distributed FileSystem获取分布式文件系统,从而向NameNode发送请求,NameNode判断路径下要写的文件是否已经存在,如果存在,返回报错信息,如果不存在,返回可以写。
(2)客户端收到回复之后向NameNode请求上传到哪个地方。例如:假设上传一个.txt文件,大小为300M,在客户端时通过切分为128M,128M,44M三个block块,先申请上传第一个块到哪一个DataNode,默认副本是3个。
(3)NameNode会向客户端返回DataNode的位置,假设为dn1,dn2,dn3。
(4)客户端收到返回的位置,通过FSDataOutputStream开始上传,就近向DataNode发起上传请求,比如说向dn1发起请求,dn1收到请求会继续调用dn2,dn2调用dn3,建立通信管道。
(5)dn3、dn2、dn1主机应答客户端。
(6)客户端开始上传第一个block块,以packet为单位(64KB),dn1收到一个packet就会传给dn2,dn2传给dn3,dn1每传一个packet会放入一个应答队列等待应答。
(7)当一个block块传输完成后,DataNode会向客户端返回数据已传输完成的信息,同时传输完成的数据会写入磁盘。
(8)客户端再次请求NameNode上传第二个block块,重复2-7的流程,当所有block传输完成时,写流程结束。

2、读数据流程

在这里插入图片描述
(1)首先调用FileSystem.open()方法,获取到DistributedFileSystem实例。
(2)DistributedFileSystem 向Namenode发起RPC(远程过程调用)请求,获得文件的开始部分或全部block列表,对于每个返回的块,都包含块所在的DataNode地址。
(3)DistributedFileSystem会向客户端client返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据,FSDataInputStream包含一个DFSInputStream对象,这个对象用来管理DataNode和NameNode之间的I/O。
(4)客户端调用read()方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
(5)DFSInputStream对象中包含文件开始部分的数据块所在的DataNode地址,首先它会连接包含文件第一个块最近DataNode。
(6)首先它会连接包含文件第一个块最近DataNode,随后,在数据流中重复调用read()函数,直到这个块全部读完为止。
(7)如果第一个block块的数据读完,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。
(8)如果第一批block都读完了,DFSInputStream就会去NameNode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值