开篇之前我们在这里先明确下hdfs是一个分布式文件存储系统,其和linux是相似的,linux也能算是一个文件存储系统(当然严格意思上是一个操作系统,但其所有的配置和命令都是以文件的形式存储,所以我们在这里就全当他是文件系统理解吧),但不是分布式的。其次,在我们日常的学习过程当中,我们使用的是伪分布式,就是我们的NameNode,DataNode和SecondaryNameNode是被部署到同一台机器之上的。而启动hdfs的脚本是存放在hadoop软件下的sbin目录下的,使用./start-dfs.sh就可以启动hdfs的三个进程了。
当输入jps后能看到NameNaode,DataNode和SecondartNameNode这个三个进程就是启动成功了。
那么现在我们来了解下hdfs的一些基本概念
1,block块
什么是block块呢,在一般的单机文件系统里面文件的存储都是将整个文件存储到文件系统当中,但是在hdfs当中,有的时候文件会很大并且有可能文件比较重要,我们需要复制多几个副本来存储,这样所占用的资源就很离散了,如果再来一个大文件估计可能就没办法再存储了。所以hadoop就使用了化整为零的思想,将一个大文件切分成一堆的小数据块来存储,就相当于将一大壶水分别导入到多个相同的杯子里方便存放。而blocksize的大小也是一个可以配置的参数,我们默认是使用128M的。那么一个300M的文件会这么存储呢?
这里给出一个例子,首先我们用300去整除128得到2余44M,意味着文件将首先填满两个128M的block块,然后余下了44M在去填充一个block块,这样一个300M的文件就使用了3个block块,当我们的副本系数为1的时候,就是这样子了。
再举个例子,一个150M的文件要怎么存储呢?用150整除128得到1余2M,意味这个文件填满了一个128M的block块,而后余下了2M这又需要另外一个block来装载它,所以一共用了2个block块来装。
2,副本系数
我们在学习的过程中都是使用伪分布式的所以就只是用了1个副本系数,但是在正常的生产当中,数据怎么可能就只有一份呢?你hadoop是指望使用廉价的机器就能完成大数据的存储,那么肯定经常又机器挂掉的,如果那个机器挂掉后无法恢复数据,那么你的文件不就数据缺失了吗?所以我们一般会将文件的block复制多份放置到不同的机器里面,这样就可以在某台机器挂掉后无发恢复数据时直接copy过去了。
这里给出一道面试题:
一个文件160M,副本系数为2,默认一个block为64M,请问实际存储的空间是多少,有多少个block块呢?
既然block默认是64M,那么我们就直接套用公式呗,160整除64得2余32,这就意味着将使用3个block,其中两个被全部占用,另外一个只用了32M,然后因为副本系数是2,所以这个3个block都被复制了两份,所以一共就有6个block,而实际使用了320M,记住最后一个block只使用了32M,别用64*6啊。
3,HDFS架构设计:主从
可以说大部分的大数据架构设计都是主从关系,什么是主从关系呢?就是一个主节点负责总管全局,而干活的都是些从节点。在hdfs里面,NameNode就是主节点,而DataNode就是从节点,至于SecondaryNameNode可以先理解为主节点的副手吧。
NameNode:文件系统的命名空间以维护一下几个内容。a.存储文件的名称。b.文件的目录结构。c.文件属性(创建时间,权限,副本系数等)。d.文件都对应哪些数据块(数据块分布在DataNode节点上,这个俗称blockmap)。需要说明的是NameNode节点是不会持久化地存储这种映射关系的,集群在启动和运行的时候,DataNode会定期发送blockmap个NameNode,因此NameNode在内存中是动态维护这种映射关系的。
作用:管理文件系统的命名空间,维护文件系统目录树,以两种文件永久保存在磁盘上。文件空间镜像文件fsimage,编辑日志editing
DataNode:存储数据块和块的交验和,为什么要有一个交验和呢?是因为数据在网络的传输过程当中有可能存在数据的丢失,所以我们需要交验一下。同时,DataNode要保持与NameNode的通讯,一般是每3秒发送一次心跳包,每10次心跳发送一次blockreport,这个blockreport就是把blockmap的相关信息发送给NameNode
作用:文件数据块的读写。
SecondaryNameNode:存储fsimage和editlog这两个文件的
作用:定期合并fsimage和editlog生成新的fsimage文件并返回给NameNode,就是俗称的检查点,checkpoint。
检查点的参数也是可以设置的,比如每个检查点的周期,默认是3600秒,但一般生产上可能是1200秒甚至更少。
现在我们来解释一下什么是fsimage和editlog,他们分别是镜像文件和编辑日志,其中编辑日志记录了所有的读写操作,而镜像文件这记录了文件系统目录树,因此fsimage是全量记录,而editlog是增量记录。
过程是这样的,SNN通知NN准备提交editlog,这个时刻NN开始产生edits.new,SNN获得这个时刻之前的fsimage和editlog后合并成一个fsimage.ckpt(同时也备份了fsimage和editslog),同时并把这个fsimage.ckpt返回给NN,然后NN在获得fsiamge.ckpt后将fsimage.ckpt和edits.new重命名为fsimage和editslog。
所以我们可以推测当NameNode挂掉的时候,SecondaryNameNode代替NameNode时将会丢失最近一个检查点到现在的editing但还复原最近一个检查点所生成的fsimage镜像文件。
4,副本放置策略
首先,我们明确一下机架的概念,就是同一个架子放多的服务器。
数据是以块存储在DataNode节点上的,一般一台机器就是一个节点嘛(也有特殊的)。
假设,我们是在DataNode节点上提交文件的,那么第一个块就存储在这个节点上了(就近原则),如果不是在DataNode上提交的,就随机挑选一个磁盘合适cpu负荷也不高的节点。然后第而个块就放在不同的机架上的一个节点,而第三个块就放在与第二个块相同的机架上的不同节点(这里我们假设副本系数是3,使用了机架来放机器了)。
建议读写hadoop的官网:https://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html