3.HDFS读写流程

3.HDFS读写流程

1.HDFS基础知识
2.HDFS操作
3.HDFS读写流程
在这里插入图片描述

3.1 工作机制–角色与角色职责

主角色:NameNode(核心) 是访问HDFS的唯一入口
维护和管理文件系统元数据(名称空间目录树结构、文件和块的位置信息、访问权限等信息

在这里插入图片描述

从角色:DataNode
负责具体的数据块存储,它的数量决定了HDFS集群的整体数据存储能力。
主角色辅助角色:SecondaryNameNode

在这里插入图片描述

3.2工作机制–上传文件流程(写文件流程)
什么事pipeline管道(传输方式)

Pipeline管道,是HDFS在上传文件写数据过程中采用的一种数据传输方式
客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点

pipeline传输的好处

依次传递能充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时,所有的数据副本能在短时间内同时完成

在这里插入图片描述

核心概念–ACK应答响应(确保数据传输安全、不丢失
ACK (Acknowledge character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误
在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全
⭐️扩展知识点:机架感知,运维人员通过脚本给设备编写路径以确定彼此位置

在这里插入图片描述

举例:上传一个300MB的文件
以128MB为一块进行分割,可以分成3块(128MB、128MB、44MB)   
#1、客户端向NameNode发送数据上传请求,这个请求当中包含一个重要的信息就是文件的长度信息。300MB
过程:HDFS客户端创建FileSystem的实例对象DistributedFileSystem
(`FileSystem封装了与文件系统操作的相关方法`)
然后调用DFS对象里的create()方法,通过-RPC请求-NameNode(NN)创建文件
#2、NameNode接收到客户端的请求之后会做一系列的检查
过程:NN执行各种检查判断
	a)文件是否存在,如果存在,报错
	b)上传文件的父目录是否存在,如果不存在,报错
	c)客户端是否有创建该文件的权限等其他内容
#3、检查通过NN就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据'NameNode在检查通过之后会向客户端返回-存储节点信息和分块信息-')
存储节点信息:存哪里?(默认3,返回ABC3个节点信息)
DataNode副本备份策略(`3副本存储策略-就近原则-`)如下:(通过机架感知实现)
(1)考虑网络传输效率,第一个优先考虑与客户端最近的dataNode(后面称该dataNode为dataNodeA,后面的如此类推)
(2)效率副本可靠性,第二个DataNode会考虑与第一个不同机架的dataNode
(3)第3个dataNode一般会在第二个DataNode的机架上挑一个其他节点
分块信息:存n块( nX3=3,对数据进行)
blk_1 存储前128M的数据, 0-128
blk_2 存储之后128M的数据, 128-256
blk_3 存储剩余的44M数据,256-300
('物理切块:真实的切分,将200M切分为128M+72M。两个块会分别存储')

在这里插入图片描述

'开始传输块'#4、客户端接收到第三步NameNode返回的响应之后开始搭建pipeline管道
客户端请求3台DN中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline构建完成,完成之后会逆序逐级返回一个响应给客户端

在这里插入图片描述

#5、根据块的id顺序上传文件并进行【物理切块】
开始真正的文件上传,边上传边进行数据的物理切块(切2次)
第一次以块为单位分割,读出0-128M作为第一个块block('通过光标seek定位读数据')
第二次将块分成一个个数据包packet(默认64K)并生成一个内部数据队列data queue(应答队列等待应答,排序)

在这里插入图片描述

#6、客户端通过FSDataOutputStream输出流开始上传数据
当第一个台DataNode收到packet后,首先会放进内存,然后将内存中的数据保存一份到本地,一份传递给与自己连接的下一个datanode(A->B->C),完成传递的DN等待ACK信息(`数据保护`)
('当一个block传输完成之后,客户端再次调用搭建pipeline管道,对第二个block进行【物理切块】,请求namenode上传第二个block的packet,并依次传递至各个节点。即重复4-5-6步骤')
                          (`数据保护``过程中OutputStream也维护着一个内部数据包队列来等待DataNode的收到确认回执,称之为确认队列(ack queue),只有收到pipeline中所有DataNode确认信息后,该数据包才会从确认队列删除`

#7、客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭
#8、DFS联系NameNode告知其文件写入完成,等待NameNode确认

在这里插入图片描述

#思考🤔:上传过程中,有的节点上传失败咋么办?
文件上传过程中如果有一个节点的块上传失败,那么会立即进行一次重试,如果重试还是失败,则会将失败的节点从pipeline中剔除,并将失败的节点报告给NameNode
⭐️传输期间,因为NameNode已经知道文件由那些块组成
(`DataStream请求分配数据块`)
因此仅需等待最小复制块即可成功返回ACK信息
最小复制是由参数dfs.namenode.replication.min指定,默认是1
(`意指只要有1个副本成功上传即可,因为剩余副本能根据第一个副本拷贝`)
如果3个节点都失败,则会重新向NameNode申请3个节点,重新构建pipeline
保证至少有一份上传成功,其他的副本会在集群空闲的时候进行异步复制
#思考🤔:为什么小文件上传速度也很慢,不应该越小越快吗?
上传过程中,有许多步骤(1-2-3-4和7-8)运行过程与文件大小(和步骤5-6重复次数有关)无关
例如,从家里去菜场买菜,花费的时间与菜的价格无关,菜的价格取决于做几次对比
3.3工作机制–下载文件流程(读文件流程)
#流程步骤:
1、HDFS客户端创建FileSystem的实例对象DistributedFileSystem(`FileSystem封装了与文件系统操作的相关方法`)
2、调用DFS对象的open()方法来打开希望读取的文件
3、确定块位置,找最近的块数据----DFS使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息(`运用到机架感应,寻找那个副本离客户端近--网络拓扑图中的远近,指彼此之间通讯横跨多少交换机`)对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前
4、DFS将FSDataInputStream输入流返回到客户端以供其读取数据
5、客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()
6、当该块结束时,InputStream将关闭与DataNode的连接,然后寻找下一个块的最佳datanode。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流
('依次返回--读取--块数据,在本地(客户端)拼接,客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息')
                   #为确保数据完整性,需校验(CRC校验)
7、一旦客户端完成读取,就对FSDataInputStream调用close()方法
3.4工作机制–NN和DN之间的通信机制
通信机制也就是主从之间的心跳机制(`报活,确认DN是否存在`),数据块汇报机制(`确认数据状态`#心跳机制:
DataNode会定期(`dfs.heartbeat.interval配置项配置,默认是3秒`)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效
#数据块汇报机制:
DataNode会定期向NameNode进行自己持有的数据块信息汇报,汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时

每次启动时,DN需要向NN注册自己并汇报自己持有的数据块信息('应对了NN职责中,不持久化储存每个文件中,各个块所在的DN的位置信息'
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值