HDFS写入读取原理详解
前言
HDFS(分布式文件系统)是当下大数据处理组件Hadoop的重要组成部分,用来处理海量数据的存储问题。
企业面试常常会询问些原理方面的知识,只是知道如何操作是不行的,毕竟原理是你学会工具调优的基础,毕竟到企业级开发,不能像在学校demo级开发那么奢侈,能省则省,用最小的资源,获得性能最优是关键。
HDFS的三大角色
在HDFS中,关键的三大角色为:NameNode(命名节点)、DataNode(数据节点)、Client(客户端)
我们来看看上面的这张图,我们根据这个图来简单描述下这三个元素的作用。
NameNode:从图上我们可以看到Client会存储Metadata(元数据)到NameNode上,同时也可以从NameNode上都去Metadata。那么,Metadata
里包含什么呢?Metadata主要包含了从Client上传的文件存储的路径以及文件在DataNode中的block块位置,以便我们需要读取的时候还能够找到他们,这就好比你去银行存钱,你说你账户想不起来了,这咋去找你的存款呢?
DataNode:HDFS会将数据存储在不同的服务器上,这就是分布式的意义,而每个服务器就可以理解为是一个DataNode。在DataNode中,文件都是以Block块的形式进行存储。存储是通过NameNode的元数据中的信息来分配的,Client也是通过获取存储在NameNode上的元数据来读取各个分布存储的Block块。
Client:这个就没啥好说的,我们用户通过客户端来执行HDFS的操作,实现HDFS的读取、写入等等操作。
HDFS写入过程
这里有两张图,画了HDFS的写入文件流程,应该是能很直观地理解,就不赘述了。我们来讲些这么设计的缘由吧,这样更好地帮助大家理解。
为什么文件要切成block块存储?
HDFS作为一个分布式文件系统,目的是解决大型数据文件的存储。单节点存储的问题是什么?就是单个节点服务器可能存储不了庞大的文件。
比如说服务器500GB的容量,然后你要存1个1TB的文件,这明显存不下来,那我们只能去换个更大服务器,但是当你换了一个1TB的服务器,勉勉强强地存下了,但是没有内存去进行其他服务的运行了,明显也不行,那么我得去买个更大容量的服务器,这个成本蹭蹭地往上窜,毕竟容量越大的服务器价格几倍地涨啊,完全不实惠。
解决方案嘛,可以买3台500GB的服务器,通过HDFS把文件切割成block块,分别平摊的存到3个服务器上,这样的话对于这三个服务器存储量都是能够接受的,且都可以进行后续的计算,而且三台500GB的服务器的成本肯定比一台1.5TB的服务器成本低。
为什么DataNode中文件block块有重复?
因为是分布式存储,你不能保证你这个文件存储的服务器哪一天突然就挂了,要是不做副本备份,你的数据就这么丢失了。这个问题是十分严重的,毕竟那些删库跑路的程序猿对于一个企业的损失都是千万级别的,都是牢底坐穿的。
DataNode中block写入为什么不是都通过NameNode写入
HDFS设计是基于线性的流水写入,不支持并行的操作。NameNode选择一个DataNode写入block块,之后是存储的DataNode对其他的DataNode建立流水线进行复制备份操作,默认是保存3份,即有三个DataNode拥有同一个block。
HDFS读取过程
读取相对应于写入就比较简单了,和单节点的读取没有什么区别,唯一不同的是在读取完block块后,先是返回到客户端的缓存区进行组装成完整的文件,随后再给客户端使用。上面的两张图片将整个流程展现的十分清楚了,这里也不进行赘述了。
结语
如果说这篇文章有让你学到一定的知识的话,不妨点个赞和关注,让博主能够看到。如果讲解中有什么错误和疏忽,也劳烦在评论中指出或提问,博主会第一时间进行更新和答复,谢谢!