Hadoop系列八之HDFS工作原理

本文目录:

  • HDFS写数据流程
  • HDFS读数据流程
  • NameNode和SecondaryNameNode
  • DataNode

1.HDFS写数据流程
1.1. 剖析文件写入过程

在这里插入图片描述
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件(RPC),NameNode进行权限检查并查验目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端对文件切分后,请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道(Pipeline)建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(9)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
1.2 术语说明

  • Block
  • Packet
  • Chunk

(1)Block
block是最大的党委,它是最终存储于DataNode上的数据粒度,由dfs.block.size参数决定,hadoop2.x以上配置为128M,可以根据实际情况调整。
(2)Packet是中等的一个单位,它是数据由DFSClient流向DataNode的粒度,以dfs.write.packet.size参数为参考值,默认是64K;这个参数可以调整,调整的目标是这个packet的大小刚好包含结构中的所有成员,同时也保证写道DataNode后当前block的大小不查过设定值。
在这里插入图片描述
a. 一个Packet是由Header和Data两部分组成,其中Header部分包含了一个Packet的概要属性信息,Data部分是一个Packet的实际数据部分
b. Data部分主要包括一个4字节校验和(Checksum)与一个Chunk部分,Chunk部分最大为512字节
b. 在构建一个Packet的过程中,首先将字节流数据写入一个buffer缓冲区中,也就是从偏移量为25的位置(checksumStart)开始写Packet数据Chunk的Checksum部分,从偏移量为533的位置(dataStart)开始写Packet数据的Chunk Data部分,直到一个Packet创建完成为止。
c. 当写一个文件的最后一个Block的最后一个Packet时,如果一个Packet的大小未能达到最大长度,也就是上图对应的缓冲区中,Checksum与Chunk Data之间还保留了一段未被写过的缓冲区位置,在发送这个Packet之前,会检查Chunksum与Chunk Data之间的缓冲区是否为空白缓冲区(gap),如果有则将Chunk Data部分向前移动,使得Chunk Data 1与Chunk Checksum N相邻,然后才会被发送到DataNode节点
(3)chunk是最小的一个单位,它是DFSClient到DataNode数据传输中进行数据校验的粒度,由io.bytes.per.checksum参数决定,默认是512B;实际上,一个chunk还对应一个4B的校验值,因此,chunk写入packet时时516B,数据与校验值的比例为128:1,所以对于一个128M的block会有一个1M的校验文件与之对应。
(4)小结:

  • 一个文件被拆成多个block进行存储
  • 数据通讯过程中一个 block 被拆成多个packet
  • 一个 packet包含多个chunk

1.3 写数据的三层Buffer
HDFS写入数据过程中会以chunk、packet及packet(data) queque三个粒度做三层缓存:
(1)当数据流入DFSOutputStream时,DFSOutputStream内会有一个chunk大小的buf,当数据写满这个buf(或遇到强制flush),会计算checksum值,然后填塞进packet;
(2)当一个chunk填塞进入packet后,仍然不会立即发送,而是累积到一个packet填满后,将这个packet放入dataqueue队列;
(3)进入data queue队列的packet会被另一线程按序取出发送到datanode;(注:生产者消费者模型,阻塞生产者的条件是data queue与ack queue之和超过一个block的packet上限)

在这里插入图片描述
说明:ackqueue中会储存发送的packet,等待所有DataNode应答后,移除已经应答的packet。
1.4 写入异常的解决
(1)在建立pipeline时,datanode异常
将异常的datanode从列表中剔除,其他的datanode建立pipeline
(2)在传输packet过程中,datanode异常,未应答
packet传输后,未收到datanode节点应答,packet会从ackqueue中移回dataqueue,准备下一轮再次发送一遍。
(3)如果datanode始终无应答
当datanode向namenode汇报时,发现某个数据块副本数未达到要求,会让已经有数据的datanode重新和其他datanode建立pipeline,进行数据传递。
1.4 节点网络拓扑结构
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和,一定要通过共同的祖先(按照拓扑图理解)

在这里插入图片描述
1.5 机架感知和副本节点选择
(1)机架感知
感知hadoop集群中每个机器节点所属的机架。
开启机架感知的好处:
a. 不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架;
b. 为了提高容错能力,名称节点会尽可能把数据块的副本放到多个机架上。
详细可参考:https://blog.csdn.net/qq_31454379/article/details/105497503
(2)副本节点选择
低版本Hadoop副本节点选择(2和3在一起)
  第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
  第二个副本和第一个副本位于不相同机架的随机节点上。
  第三个副本和第二个副本位于相同机架,节点随机。
  
在这里插入图片描述
Hadoop 2.7.2副本节点选择【重要】(1和2在一起)
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点。(第二副本与第一副本距离更近)
第三个副本位于不同机架,随机节点。

在这里插入图片描述
2.HDFS读数据流程

在这里插入图片描述(1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址(提供security token)。
(2)挑选一台DataNode(就近原则)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
(5)如果在读取数据的过程中,DFSInputStream和DataNode出现通讯中断,DFSInputStream会尝试连接其他的DateNode,同时会记录之前出问题的DataNode(防止再次连接);此外,DFSInputStream会对传输数据的校验和进行检查,如果发现损害,会上报NameNode,重新从其他的DataNode读取数据。
3.NameNode和SecondaryNameNode
3.1 内存数据持久化
内存数据持久化常用方法:日志文件和镜像(快照)
(1)日志文件
记录实时发生的增删改的操作至文本文件中。
特点:

  • 完整性比较好

  • 只做数据的追加

  • 加载恢复数据:慢/占空间
    (2)镜像(快照)
    内存全量数据基于某一时间点向磁盘做全量溢写(dump/序列化,I/O)
    特点:

  • 加载恢复数据速度快

  • 因为是间隔的,容易丢失一部分数据

例子:Redis使用了以上两种策略,分别是RDB和AOF
3.2 NN和2NN工作机制
NameNode中元数据持久化,采用了日志文件+快照的方式,即FsImage+Edits。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值