浅谈Hadoop技术——HDFS

来源:互联网 发布:如何举报淘宝店铺盗图 编辑:程序博客网 时间:2024/06/05 08:10

hdfs是hadoop中的一个存储数据的分布式文件系统,何为文件系统?文件系统是屏蔽掉底层磁盘的存储细节,向上层提供与一个统一的数据访问接口。所以hdfs的作用就是对使用者屏蔽掉所有分布式的节点的存储细节,向使用者提供一个统一的数据访问接口,感觉起来就像操作一台节点上的文件系统一样,不会感觉到在操作很多个节点。

HDFS的存储原理

这里写图片描述
在hdfs中存在三种节点分别是:NameNode、DataNode、SecondaryNode。
DataNode:负责存储实际数据的
NameNode:存储的是文件的元信息,文件的block块信息。
hdfs在存储文件的时候会把文件分成若干个block块(默认是128M大小,不够128M的按128M大小存储)存储在DataNode中,而把每一个block块的信息(大小,偏移量,存储在哪一个DataNode中,几个副本等)存储在NameNode中。在DataNode中只是存储了一些看起来没有联系的block块,所以只有通过NameNode中的元信息才能把这些block块联系起来,有组成实际意义的数据。

如果想要存储一个700M大小的文件,那么这700M的大小会被分成好几个block块存储在不同的DataNode中,并且为了数据的丢失每个block块都会有副本(默认是三个),而NameNode中只是存储了几K的block块的元信息。所以一般在HDFS中DataNode的数量是很多的,并且DataNode之间中存储的数据是没有联系的,所以对于HDFS的扩容也就方便了很多,只要简单的添加DateNode就可以,不会影响到以前的数据。NameNode存储的数据的大小相比DataNode就小很多了,所以有时候一台节点就能够存储下来这些数据,但是NameNode中的数据确是很重要,如果你的NameNode坏掉了,那么就算你的所有DataNode都很好的运行,那么你的HDFS存储的数据也就全都没有,所以对于NameNode存储的数据量一台节点就能应付,但基于NameNode的重要性,一定要做好NameNode的容错备份。

关于DataNode中block块及副本的存储规律

1、先在客户端所连接的datanode上存放一个副本
2、再在另一个机架上随机选择一个datanode存放第二个副本
3、最后在本机架上根据负载情况随机挑选一个datanode存放第三个副本

SecondaryNode的作用

首先我们先想象一个场景,在大数据的时代下,数据的增长是很快的,所以数据往HDFS中存储的频率也是很快的(在这里我们说的是在NameNode中存储元信息的情况,因为DataNode有无数台节点,不会遇到高频率的磁盘读写情况)。既然是存储数据,那么就会让数据落地到磁盘,但是我们想象在大数据的环境下,我们可想而知磁盘所要面临怎样的IO读写频率,反正是磁盘肯定受不了这样高频率的读写频率。那我们会想到既然涉及到大数据存储,何不选用内存存储呢,现在的内存价格也低,NameNode中的元数据数量也小。但是如果存在内存中数据是容易丢失的,况且NameNode中的数据还是那么的重要。所以为了解决这种既能让数据断电不丢失,又能应付高频率的读写。HDFS就想到了一个解决办法,那就是我把NameNode中的数据信息在磁盘中存一份二进制的数据文件,在内存中存一份,这样就可以解决上面的两个问题了,但是新的问题又来了,如何解决磁盘中数据与内存中数据的同步问题。内存的IO读写频率是很快,但是当它把数据落地到磁盘的时候慢下来了,如果在内存中的数据还没落地到磁盘中时,就断电了,那么数据不就丢失了吗。所以HDFS又想出了一个办法就是,在NameNode中创建一个日志文件,所有想内存中写数据的操作都会记录下来(这种追加字符串的速度在磁盘中是很快的),当这个日志问价达到一定大小后就会把这个文件中的操作与磁盘数据合并起来。这样就算断电,HDFS下次启动的时候,会往内存中加载这两个数据的信息,数据不会丢失。日志文件与磁盘的二进制数据文件就在SecondaryNode节点中合并数据的。

当一个文件上传到HDFS的过程:
首先在客户端执行上传命令

hadoop fs -put /root/test.tar.gz /

客户端会向NameNode发出指令,NameNode会为这个文件生成元数据信息返回给客户端通知其他文件分块存储到DataNode中,并把信息追加到一个名为editor.log的文件。当客户端把文件上传到DataNode成功后会向NameNode返回一个成功信息,之后NameNode会把元数据信息写进内存中。
当editor.log文件达到一定大小后SecondaryNode会通知NameNode切换一个新的editor.log文件(editor.new),让日志文件不再写进旧的editor.log文件。之后SecondaryNode会通过Http下载把editor.log和fsimage(落地的元数据信息就保存在这个文件中)下载到SecondaryNode节点中进行合并到一个fsimage文件中,合并完后再把fsimage文件上传到NameNode节点上。并且把editor.new文件改名为editor.log文件。

0 0
原创粉丝点击