一、HDFS产生背景
在互联网时代,数据不断增加,随着数据量的增加,在一个操作系统存不下所有的数据,那么久分配到更多的操作系统管理的磁盘中,但将数据分散的存储在不同的操作系统中,不便于管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。
HDFS(Hadoop Distributed File System)是一种分布式文件系统,用于存储和管理大规模数据集的分布式存储解决方案,通过目录树来定位文件。
二、HDFS组成架构
HDFS主要由NameNode、DataNode、SecondaryNameNode、Client组成。NameNode,DataNode之间具有主从关系。
1)NameNode(nn):相当于Master,它是一个管理者
—> 元数据管理:NameNode负责管理HDFS的元数据。
此处的元数据如果小伙伴们不了解,可以看我的另外一篇文章
https://blog.csdn.net/weixin_73844647/article/details/135885406?spm=1001.2014.3001.5501
—> 块映射:NameNode维护一个块到数据节点的映射表,它记录了每个数据块的副本存储在哪些数据节点上。
—> 客户端请求处理:NameNode处理客户端的文件系统请求,例如创建、删除、重命名文件或目录,以及读取文件的元数据信息。
2)DataNode(dn):相当于Slave,NameNode下达命令,DataNode执行实际操作。
—> 数据块存储:DataNode负责存储实际的数据块。他们根据NameNode的指示将数据块写入本地磁盘,并在需要时将数据块传送给客户端。
—> 块报告:DataNode周期性地向NameNode发送报告,告知NameNode它们存储了哪些块,并报告数据块的将抗状态。
—> 块复制:如果某个数据块的副本数下降到预定的阈值以下,DataNode会复制丢失的块副本,以维护数据的可靠性。
3)SecondaryNameNode(2nn):辅助恢复NameNode
—> 元数据备份:SecondaryNameNode的主要作用是定期备份NameNode元数据。需要注意的是它并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。它不会处理实际的文件数据,而只是备份元数据。
—> 日志合并: Secondary NameNode也负责合并HDFS事务日志(编辑日志),以帮助减小NameNode的编辑日志大小,防止过大的编辑日志导致启动时间过长。
4)Client:客户端
—> 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
—> 与NameNode交互,获取文件的位置信息;
—> 与DataNode交互,读取或者写入数据;
—> Client提供一些命令来管理HDFS,比如NameNode格式化;
—> Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
三、上传下载文件过程
1.前置信息
文件在HDFS中会被分成默认为128M的块(block)存储,便于以后的分区或者分桶来达到提升查询效率的目的
2.客户端读取hdfs文件内容的流程
客户端请求
1)nameNode验证请求,如客户端权限,元数据中文件是否存在
从nameNode取到目录树,找到保存数据节点的地址返回,选择最近的节点
2)从dataNode读数据并在读完后到下一个dataNode,最后合并
3)读取文件,执行操作
4)关闭连接
3.客户端向hdfs写内容的流程
客户端请求
1)nameNode接受请求,验证权限等,查询目录树中文件的位置
2)nameNode确定写入内容,分配dataNode存储
3)客户端连接dataNode
4)客户端将数据切块,发送数据块,dataNode将数据写入并确认是否写入
5)复制副本一般存3份
6)返回节点位置,写入情况到nameNode作为元数据
四、HDFS的优缺点
在了解了文件上传下载的过程后,我们来看看其优缺点,相信大家能够更容易理解
优点
1)高容错性:数据自动保存多个副本,它能够通过增加副本的形式,提高容错性。当某一个副本丢失后,它可以根据其他节点上的副本数据自动恢复。也就是上面的复制副本
备份机制如下
2)适合处理大数据
- 数据规模:能够处理数据规模达到GB、TB甚至PB级别的数据;
- 文件规模:能够处理百万规模以上的文件数量。
3)高可扩展性: HDFS可以轻松扩展以处理大规模数据,只需添加更多的节点即可。这种可扩展性使其适用于应对不断增长的数据量。NameNode 和 DataNode 的主从关系
4)数据本地性: HDFS会在数据节点上存储数据块,这使得计算可以在数据附近进行,减少了网络传输的开销,提高了性能
缺点
1)延迟问题: HDFS通常用于批量数据处理,对于需要低延迟的实时数据访问场景不太适用。读取数据的响应时间可能会较长。做不到向Mysql那样快速相应数据。
2)无法高效的对大量小文件进行存储
对于每一个存储在HDFS文件系统中的文件,HDFS都会开销一部分内存来存储它的一些元数据(包括目录和块信息等),存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的,太多的小文件会徒增NameNode的负担,甚至会使其崩溃。同时一个块的大小为128M,小文件的内存使用率较低。
3)不支持原子性写入操作:
由上面的上传下载过程可知,文件的修改需要将一整个文件加载到内存中,方可修改,然而这在大数据情况下是不可取的,因此HDFS不支持原子性写入操作。
而且如果多个客户端同时尝试写入同一文件,可能会导致数据不一致性。因此HDFS规定:
- 一个文件只能同一时间只能有一个写,不允许多个线程同时写;
- 仅支持数据追加(append),不支持文件的随机修改。