HDFS写流程

本次学习全程参看于Jin’s Blog

HDFS写流程

概述

img

![img](https://i.loli.net/2021/09/22/jV1yI5NiOhQbYwe.png

img

HDFS写流程就是我们通过客户端向HDFS写入数据的过程。

我们写文件并不知道文件的大小

写流程的大体流程:client首先向NameNode发出请求,请求创建文件,此时根据文件目录,在树形目录下创建文件。(仅仅是创建了文件)和开启租约。

client根据NameNode返回的信息,将自己的数据写入到HDFS,会向NameNode申请block和dataNode。

client向DataNode传递数据,有两套系统,数据传递系统和数据确认系统。

client只向数据传给第一个DataNode,然后从第一个DataNode依次传递给下一个DataNode,直到最后一个DataNode。

数据的确认是从最后一个DataNode开始传递至上一个DataNode,反顺序,一直到client。

1–>2–>3

1<–2<–3

create方法

客户端:

image-20210922161237862

客户端FileSystem通过DFSClient向NameNode发出创建文件的请求,生成DFSOutputStream,用来接收NameNode返回的信息,同时启动DataStreamer(一个线程用来传递数据)。

NameNode端:

image-20210922164555126

NameNode端接受到client的命令请求,会先判断请求的文件名是否存在,如果存在,能否重写。重写的话,先获得我们要删除的INode文件和Block文件,将Inode和block分别交给FileSystem和bLockManager进行了删除,创建父类的文件夹,和创建文件。创建完成将文件信息返回给Client。

write方法

客户端:

概述:

在客户端存在着两个队列和两个线程,DataQueue中存放的是要发送的数据,ackQueue中存放的是已经发送等待确认的数据。DataStreamer线程在于把dataQueue中的数据发送给DataNode,同时将dataQueue中的packet移到ackQueue中;PesponceProcessor线程接受DataNode所传来的确认信息,如果正确将packet从ackQueue中移除,如果错误,就报错。

数据传输格式

在这里插入图片描述

PacketLength大小为: 4 + CHECKSUMS(校验数据的大小)+ DATA(真实数据的大小)

BlockSender发送数据的格式包括两个部分: 校验信息头(ChecksumHeader) 和数据包序列(packets) 。

|校验信息头(ChecksumHeader) |数据包序列(packets) |

4.1.校验信息头(ChecksumHeader)
ChecksumHeader是一个校验信息头, 用于描述当前Datanode使用的校验方式等信息。

| 1 byte校验类型(CHECKSUM—TYPE) | 4 byte校验块大小(BYTES_PER_CHECKSUM)|

■ 数据校验类型: 数据校验类型定义在org.apache.hadoop.util.DataChecksum中, 目前包括三种方式——空校验(不进行校验) 、 CRC32以及CRC32C。 这里使用1byte描述数据校验类型, 空校验、 CRC32、 CRC32C、分别对应于值0、 1、 2、3、4。

另外两种类型 : CHECKSUM_DEFAULT、CHECKSUM_MIXED 对应于值3、4 不能用户创建 DataChecksum .

■ 校验块大小: 校验信息头中的第二个部分是校验块的大小, 也就是多少字节的数据产生一个校验值。 这里以CRC32为例, 一般情况下是512字节的数据产生一个4字节的校验和, 我们把这512字节的数据称为一个校验块(chunk) 。 这个校验块的概念非常重要, 它是HDFS中读取和写入数据块操作的最小单元.

4.2.数据包序列
BlockSender会将数据块切分成若干数据包(packet) 对外发送, 当数据发送完成后,会以一个空的数据包作为结束。

每个数据包都包括一个变长的包头、 校验数据以及若干字节的实际数据。

|变长的数据包头(packetHeader) | |校验数据 | |实际数据…… |

■ 数据包头——数据包头用于描述当前数据包的信息, 是通过ProtoBuf序列化的,包括4字节的全包长度, 以及2字节的包头长度, 之后紧跟如下数据包信息。

当前数据包在整个数据块中的位置。
数据包在管道中的序列号。
当前数据包是不是数据块中的最后一个数据包。
当前数据包中数据部分的长度。
是否需要DN同步。
■ 校验数据——校验数据是对实际数据做校验操作产生的, 它将实际数据以校验块为单位, 每个校验块产生一个检验和, 校验数据中包含了所有校验块的校验和。校验数据的大小为: (实际数据长度+校验块大小 - 1) / 校验块大小×校验和长度。
■ 实际数据——数据包中的实际数据就是数据块文件中保存的数据, 实际数据的传输是以校验块为单位的, 一个校验块对应产生一个校验和的实际数据。 在数据包中会将校验块与校验数据分开发送, 首先将所有校验块的校验数据发送出去, 然后再发送所有的校验块。

具体流程

得到将数据按chunk大小进行写入,提前计算好对应的checksum,将数据和检核和一起存放到存放到packet上,如果是第一个chunk,则不存在packet,需要创建packet。等到写满一个packet,将packet写入到dataQueue中。

线程操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R25VCzxw-1634178833785)(https://i.loli.net/2021/10/14/m27iuxQRbhDJC6F.png)]

当dataQueue中存在packet时,DataStreamer线程会从dataQueue中取出packet,如果是第一个packet,那么还没有向 NameNode申请block,申请Block和DataNode。然后与第一个DataNode进行连接,并且发送ChecksumHeader,接受DataNode的反应。生成ResopnseProcessor线程,将dataQueue中的packet取出,放到ackqueue中,然后将packet发送给dataNode。

ResopnseProcessor线程接受DataNode的返回,将对应的packet从ackQueue中取出。

NameNode端

方法

image-20210923110929769

选择DN(主要)

这里主要就是如何选择合适DN, 细节很多, 但是大体来说是如下的规则:

  1. 第一个DN以和Client距离最近优先
  2. 第二个DN再考虑比如跨机架等因素选择

然后满足条件的DN也需要满足一系列的基本检查, 比如可以写入, 空间充足等, 这里也暂不细说了.

DN属于哪些机架需要手动配置, 这里机架相关的选择细节暂略. 后续用到再看, 相关的流程图可以参考书中对应章节.

更新元信息

首先, 在最早客户端申请了一个空的文件, 就有了一个INode信息, 现在新增了一个block, 自然需要更新两个关系:

  • 文件和Block的关系
  • Block和对应Datanode的关系

DataNode端

img

DataNode端存在DataXceiverServer线程用来接受外部的请求,平时是堵塞的,存在请求时,DataXceiverServer会产生一个DataXceiver线程来处理请求。一个请求对应一个DataXceiver。

初始阶段

image-20210923150908925

DataNode端首先会接收client发出的建立连接请求,然后向下游DataNode发出请求,请求建立连接,直到最后一个DataNode。DataNode接收到下游返回的请求,确认连接正常,然后再将确认信息返回给上游节点。

img

datanode的任务在于接收上游节点的数据,转发

存在四个流,inpStream(上流节点所传输数据),mirrorOut(将数据转发给下游的节点),mirrorIn(接收下游节点的确认数据),replyOut(将确认数据返回给上游节点)

1启动PacketResponder线程,用来处理数据的确认。

2每次接收一个packet,

3将packet放入到ackQueue中。

4将packet转发给下游DataNode

5写入到本地磁盘中,分成data和checksum数据

6接收下游节点的相应,看是否与ackQueue中的数据相匹配,同时把自己的节点信息加入到,转发到上游节点,最后将packet从ackQueue中移除。

在最后一个DataNode会检验chunk和checkSum是否匹配。

时序图

image-20210923145344530

close方法

客户端:

image-20210923152606908

将之前write方法,不足的数据加入到packet中进行发送,同时请求关闭文件和释放租约,关闭线程和队列。

NameNode端:

block状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJKlxwLI-1634178833792)(https://i.loli.net/2021/10/14/A4CQKzpjGnhk8w6.png)]

流程:

image-20210928183902453

将当前Block提交进行关闭,同时通知dataNode复制所缺少的副本。

故障恢复

clinet

当有DataNode出现故障时,客户端会关闭管道,将ackQueue中的packet移动到dataQueue中,会再次初始化管道,先看看原先损坏的Datanode是否在重启,然后将损害的dataNode添加到坏的dataNode列表中,同时将其从正在通信的dataNode列表中移除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值