HDFS 读写架构-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、组成架构

1、NameNode(NN) : 集群的Master它是一个主管管理者

(1) 管理HDFS的命名空间
(2) 配置副本策略
(3) 管理数据块(Block)映射信息
(4) 处理客户端读写请求

2、DataNode(DN) : 集群的Slave。NN下达命令DataNode执行实际操作。

(1) 存储实际的数据块
(2) 执行数据块的读/写操作

3、Client : 客户端

(1) 文件切分。文件上传HDFS的时候client将文件切分成一个个的Block然后进行上传
(2) 与NameNode交互获取文件的位置信息
(3) 与DataNode交互读取或写入数据

4、SecondaryNameNode : 并非NameNode的热备。当NameNode挂掉的时候它并不能马上替换NameNode并提供服务。

(1) 辅助NameNode分担其工作量比如定期合并Fsimage和Edits并推送给NameNode
(2) 在紧急情况下可辅助恢复NameNode

二、HDFS存储副本机制

1、在 HDFS 中每个数据块都会被分成若干个数据块副本。默认情况下每个数据块会被复制三次到HDFS 集群中的三个不同的 DataNode 上

在这里插入图片描述
2、HDFS 会将数据块的多个副本分别存储在不同的 DataNode 上以提高数据的可靠性和容错性。如果某个 DataNode 发生故障数据块的其他副本仍然可以被访问。

3、HDFS 会尽量将数据块的多个副本存储在不同的机架rack上以避免机架故障导致数据不可用的情况。HDFS 会将数据块的多个副本存储在不同的机架的从节点上第一个副本在客户端所处的节点上。如果客户端在集群外随机选一个,第二个副本在另一个机架的随机一个节点第三个副本在第二个副本所在机架的随机节点

4、各个从节点通过机架交换机进行数据传输各个机架通过集群内交换机进行数据传输各个集群通过集群间交换机进行数据传输
在这里插入图片描述

三、HDFS 机架

1、机架数据传输距离计算

1相同的datanode距离为 0比如H1到H1 distance(/D1/R1/H1,/D1/R1/H1)=0
2同一机架下的不同datanode距离为 2比如H1到H2 distance(/D1/R1/H1,/D1/R1/H2)=2
3同一集群不同机架下的datanode距离为 4比如H1到H4 distance(/D1/R1/H1,/D1/R1/H4)=4
4不同集群下的datanode距离为 6比如H1到H7 distance(/D1/R1/H1,/D2/R3/H7)=6
在这里插入图片描述

2、为什么三分之一的副本在一个节点上三分之二的副本在另一个机架不同节点上

1hdfs 三个副本的这种存放策略减少了机架间的数据传输提高了写操作的效率。
2机架的错误远远比节点的错误少所以这种策略不会影响到数据的可靠性和可用性。
3与此同时因为数据块只存放在两个不同的机架上所以此策略减少了读取数据时需要的网络传输总带宽
4在这种策略下副本并不是均匀的分布在不同的机架上三分之一的副本在一个节点上三分之二的副本在一个机架上其它副本均匀分布在剩下的机架中这种策略在不损害数据可靠性和读取性能的情况下改进了写的性能。
在这里插入图片描述

四、HDFS 写Write流程

在这里插入图片描述

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

五、HDFS 读Read流程

在这里插入图片描述
1客户端向 NameNode 发送读取请求请求包括要读取的文件名和文件块的起始位置。
2NameNode 根据请求的文件名查询文件所对应的块列表并返回给客户端块列表以及每个块所在的 DataNode 列表。
3客户端根据返回的块列表和 DataNode 列表选择一个 DataNode 开始读取数据。如果选择的 DataNode 不可用则会选择另外一个 DataNode。
4客户端向选择的 DataNode 发送读取请求请求包括要读取的块的起始位置和长度。
5DataNode 接收到读取请求后从本地磁盘读取数据块并将数据块返回给客户端

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6