草图之----HDFS读写原理

-----------------------------------------------话不多说先上个草图----------------------------------------------


  (1)  HDFS的结构:

                                                主节点(NameNode)

                                                代理节点(SecondaryNameNode)  

                                                子节点(DataNode)    


   (2)各部分的功能:

    客户端(Client):                               HDFS的使用者,它与NameNode交流获取文件的元数据(就是我的文件分割成数据块后存放在哪)与DataNode交流,来进行数据的读写操作文件的分割在客户端中进行;

    主节点(NameNode):                     HDFS的唯一管理者,里面存放了两类元数据信息(1,文件与数据块的信息     2,数据块与子节点之间的信息,第一类信息会一边存入内存中一边存入硬盘,第二类信息会在启动NameNode时,通过hearbeat机制获取,每个DataNode会扫描本地磁盘,将第二类信息反馈给NameNode);

    代理节点(SecondaryNameNode):主节点的副手,是NameNode的冷备份,帮助NameNode合并编辑日志,减少NameNode的启动时间(补充:冷备份,a是b的冷备份,当b停止工作,a不能立刻代替b工作,只是存储了b工作的一些文件,减少损失;设备份;a是b的热备份,当b停止工作,a能够代替b工作)

    子节点(DataNode):                          HDFS的存储点,文件分割成的数据块都存放这DataNode这些节点上。

(3)写原理(一个文件从客户端存储到集群的过程)

1,客户端向主节点发送存储数据的请求------主节点查看发送请求的客户端是否有存储数据的权限

                    (1)没有权限,驳回请求

                    (2)我是VIP,拿子节点来,我要存数据

2,主节点赶紧查看手下的仓库(即子节点)哪个仓库的空间大,哪个离我们的VIP用户(有权限存储的客户端)近,将这些适合的子节点信息返回给客户端(即把仓库钥匙给了客户端)

3,客户端与合适的子节点直接进行交互(我有钥匙,我直接去仓库存放数据),因为每个数据块都会有我们设置的备份,所以客户端存放数据时按照,上草图:


小二来段解释

大爷来了:

        如上图所示,客户端拿到子节点信息后,和第一个子节点建立联系,然后子节点和下一个子节点建立联系,以此类推,将客户端和用于存放数据的子节点实现了串联,建立好了会从最后一个子节点开始向上反馈,客户端拿到反馈好的信息后开始以数据流的形式将数据写入DataNode中

        在客户端写数据时,并不是直接写入子节点的本地硬盘中的,而是写入第一个子节点的缓存区中,然后该节点开始讲缓存区中的内容一边往自己的硬盘中写一边往下一个子节点的缓存区中写,这样将每个数据块进行备份

        注意:在数据写入时,并不是按照数据块的形式进行写入,而是以数据包的形式写入,每个数据包大小为64kb,并且每写入512字节会进行一次校验,如果发现写错,会重写。

(4)数据发送完毕后,每个DataNode都会向NameNode发送写完了的信息,同时,第一个DataNode向Client发送完成信息

          Client向NameNode发送写完的信息

(5)文件的每个数据块都按照上面过程写完后,存放完毕,Client断开与DataNode的联系,关闭数据流,整个数据就存放完毕

(4)读原理(将数据从HDFS中读取到本地)

(1)同写原理,不是VIP,驳回

(2)NameNode(集群系统的唯一管理者)查看Client需要读取文件被分割成哪几个数据块,并且它们都存放在哪些仓库(DataNode)中,

(3)将合适(存放数据大,距离Client近)的DataNode信息反馈给Client,

(4)Client 与DataNode建立联系,通过数据流,将DataNode中存放的数据信息读入本地

(5)NameNode中存放着元数据,所以,当Client读完一个数据块后,NameNode会分派存放下一个数据块的子节点与客户端 建立联系,读取其中的内容,这样Client就将文件的所有数据块按顺序读入到本地

(6)Client向NameNode发送读取完成的信息,然后关闭数据流,整个数据读取过程完成


补充:

                在执行读写操作时,NameNode与DataNode通过HeartBeat(心跳机制)保持通信,如果发现DataNode死掉,就会把其中的数据放到另一DataNode中,读取时,就会读取下一个有备份的DataNode中的数据块内容

        

猜你喜欢

转载自blog.csdn.net/qq_42444621/article/details/80693064
今日推荐