Hadoop--分布式文件系统HDFS--HDFS原理解析
HDFS是一种分布式文件系统,能够实现对于文件的分布式存储管理等功能。
系统组成
客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<切块的行为是由客户端决定的>。一旦文件被切块存储,那么,hdfs中就必须有一个机制,来记录用户的每一个文件的切块信息,及每一块的具体存储机器(负责记录块信息的角色是:name node)。为了保证数据的安全性,hdfs可以将每一个文件块在集群中存放多个副本(副本数量由当时存入该文件的客户端指定的)
其系统组成如下所示:
主要由NameNode,SecondaryNameNode以及多个DataNode组成。
其中NameNode负责存放文件系统的元数据,即文件的切块信息。DataNode负责存放具体的文件块。SecondaryNameNode负责与NameNode交互完成元数据的更新等操作。
CheckPoint机制
NameNode负责存放文件系统的元数据,将其存放于内存中,为了避免因为宕机而导致内存元数据丢失需要将内存数据周期性的持久化到本地磁盘中,由于同步期间客户端也可能进行操作因此这其中涉及到内存,日志以及持久化的操作,SecondaryNameNode主要负责协助NameNode完成内存数据的持久化以及客户端操作日志的变更等。具体原理如下所示:
CheckPoint机制:
1. 客户端提交操作请求
2.NameNode修改内存元数据,并且将操作记录到edits日志文件,并且定期序列化内存数据到fsimage文件。
3. 此时如果宕机,可以根据fsimage反序列化以及执行日志文件来恢复文件系统,但由于避免日志文件过大以及fsimage反序列化执行日志操作时间过长,因此需要定期将日志文件更新到fsimage中,使fsimage版本最新,这样反序列化fsimage时执行的日志操作较少。
4. 为减轻NameNode压力,使用SecondaryNameNode来完成该项工作。SecondaryNameNode初始启动从NameNode 下载fsimage文件反序列化到内存中,下载edits文件,以后定期下载edits文件到本地,定期执行edits文件更新内存数据,将内存数据序列化到新fsimage文件中,将新fsimage文件更新到NameNode中,保持NameNode fsimage版本最新。
这其中主要涉及到内存,磁盘文件以及日志文件与Redis的持久化操作相似。
客户端写HDFS数据机制
写文件流程如下:
- 客户端从NameNode发出请求,请求写文件,指定相关参数,文件路径副本数量等
- NameNdoe告知客户端可写
- 客户端请求写第一个BLOCK
- 根据副本数量返回DataNode主机名,例如DN1 DN2 DN3
- 客户端从主机中选择最优主机例如DN1,请求建立连接
- DN1根据副本机器与DN2请求建立连接
- DN2与DN3请求建立连接
- DN3响应DN2
- DN2响应DN1
- DN1响应客户端,客户端得知块1服务器集群准备好
- 客户端使用本输入流读取待上传文件第一块内容到内存,使用网络输出流发送到DN1
- DN1使用网络输入流接收文件,使用本地输出流保存到本地,
- DN1使用网络输出流发送DN2
14-16同理DN2,DN3接收文件保存,至此第一个块写完
重复以上过程,直到所有块写完,NameNode记录元数据
客户端读HDFS数据机制
读文件流程如下:
- 客户端请求读数据/xx/xx.txt
- NameNode返回文件元数据信息BLK1:DN1,DN2;BLK2:DN2,DN3
- 客户单从块1副本中挑选最优节点例如DN1,建立连接,请求读取BLK1
- DN1本地文件输入流读取BLK1,网络输出流发送到客户端
- 客户端使用网络输入流接收,使用本地文件输出流保存到本地
- 客户端根据文件元数据读取BLK2例如DN3
- DN3发送数据到客户端
- 重复直到所有块全部下载完成,读取操作完成。