HDFS读写数据流程

在这里插入图片描述

1.HDFS读数据流程

  1. HDFS客户端通过Distributed FileSystemNamenode请求下载文件,Namenode通过查询元数据,找到文件所在的地址;

在这里插入图片描述

  1. Distributed FileSystem返回一个FSDataInputStream对象给客户端以便读取数据(FSDataInputStream中封装着DFSInputStream对象,该对象管理着namenodedatanode的I/O),接着,客户端对这个对象调用read方法;
    在这里插入图片描述

  2. 存储着文件起始几个块的datanode地址的DFSInputStream随机连接离文件第一个块最近的datanode,通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端;

在这里插入图片描述

  1. 到达快的末端时,DFSInputStream就会关闭与datanode的连接,然后寻找下一个块最佳的datanode。所有这些过程对客户端都是透明的,在客户看来它就是一直在读取一个连续的流;
  2. 客户端以packet为单位接收数据,先是缓存在本地,然后写入目标文件,一旦读取数据完成,就对FSDataInputStream调用close()方法。
    在这里插入图片描述

2. HDFS写数据流程

  1. 客户端通过对DistributedFileSystem调用create方法来新建文件,DistributedFileSystemnamenode创建一个RPC调用,在系统的命名空间中创建一个新文件,此时该文件中还没有相应的数据块;
    在这里插入图片描述

  2. namenode执行各种检查以确保这个文件不存在以及客户端有新建文件的权限。如果这些检查能够通过,namenode就会为创建新文件记录一条记录;否则,就向客户端抛出一个IOExeception对象;

  3. DistributedFileSystemnamenode申请上传第一个Blocknamenode向客户端返回可用的datanode列表;

在这里插入图片描述

  1. DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端开始向datanode写入数据。客户端通过FSDataOutputStream向dn1请求上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。dn1、dn2、dn3逐级应答客户端

在这里插入图片描述

  1. 在客户端写入数据时,DFSOutputStream将数据分成一个个的数据包,并写入数据队列;客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。

在这里插入图片描述

文章已收录于https://github.com/wangsl123/dzblog,欢迎start。微信关注【鄙人王道长】,也可第一时间看到文章。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值