一、HDFS的概念
HDFS是一个文件系统,用于存储和管理文件,通过统一的命名空间(类似于本地文件系统的目录树)。是分布式的,服务器集群中各个节点都有自己的角色和职责。
1.1 Hadoop架构
由3个模块组成:
- HDFS(Hadoop Distributed FileSystem),分布式存储HDFS
- 分布式计算MapReduce
- 资源调度框架Yarn
1.2 block块概念
大量的文件可以分散存储在不同的服务器上面
例如底下客户端和文件(1-N)都是独立的一台商业机器,大量文件从客户端机器分配到各个机器上面
单个文件比较大,单块磁盘放不下,可以切分成很多小的block块,分散存储在不同的服务器上面,各服务器通过网络连接,造成一个整体。
默认以128MB
的大小来切分,每个128MB
的文件,在HDFS叫做块(block)
并且默认打下可以通过参数配置,设置太小或者太大都不好。如果切分的文件太小,那一份数据可能分布到多台的机器上(寻址时间就很慢)。如果切分的文件太大,那数据传输时间的时间就很慢。
一个用户发出了一个1GB
的文件请求给HDFS客户端,HDFS客户端会根据配置(默认是128MB
),对这个文件进行切分,HDFS客户端会切分成8个文件(也叫做block),然后每个服务器都会存储这些切分后的文件(block)。假设每个服务器都存储两份。其中存放这些数据的服务器在HDFS中叫做DataNode(数据节点),这就涉及到HDFS三大组件的概念了。
1.3 HDFS备份
一个文件被分成了8块存储在不同的DataNode上,其中的一个机器DataNode挂掉,会造成这个数据不可用状态,所以hadoop还对每一个数据块做了一个副本,保证数据的可靠性
1.4 HDFS特点:
- 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份。
- 运行在廉价的机器上。
- 适合大数据的处理。HDFS默认会将文件分割成block,64M为1个block(默认128M)。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重
1.5 HDFS架构:
NameNode:是Master节点。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
SecondaryNameNode:分担namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。
DataNode:Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
fsimage:元数据镜像文件(文件系统的目录树)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
namenode内存中存储的是=fsimage+edits
二、HDFS的三大组件
大数据的框架大部分其实都是主从架构,就是一主多从,HDFS就是一个NameNode,多个DataNode,MapReduce就是一个JobTracker,多个TaskTracker,Yarn则是一个ResourceManager,多个NodeManager,而Spark就是一个Master和多个Slave
2.1 NameNode的介绍
大数据框架都是分布式的,可能每个角色都运行在各个不同的服务器上面,需要进行通信的时候就要需要网络的支持,而在我们客户端需要读一个文件的信息时,必须知道我们这个文件被分成了多少个block,各个block又分别存储在哪个服务器上,这种用于描述文件的信息被称为文件的元数据信息(metaData),而metaData就是存储在NameNode的内存中的
2.2 metaData的介绍
metaData的大小:文件,block,目录占用大概150byte字节的元数据,所以为什么说HDFS适合存储大文件而不适合存储小文件,可想而知存储一个大文件就只有一份150byte的元数据,存储N多个小文件就会伴随存在N份150Byte字节的元数据文件,这就非常地不划算
元数据信息以命名空间镜像文件(以下称为fsimage)和编辑日志(以下称为edits log)的方式保存,两者的作用分别是
fsimage:元数据镜像文件,保存了文件系统目录树信息以及文件和块的对应关系
edits log:日志文件,保存了文件的更改记录
复制代码
为什么元数据需要存储在NameNode的内存中呢,答案很简单,存储在内存中意味着快,当然也会存在问题,就是如果NameNode宕机了,内存就无法读取了,此时为了防止这种情况出现,也为了加快NameNode从故障中恢复的速度,就设计了一个SecondaryNameNode的角色
日志缓存方面:客户端向 HDFS 写文件,会记录下来操作日志,而这时我们会预先准备好两块缓存区域,这个日志在写满了第一块缓存时,会开始录入磁盘,也就是edits log,NameNode的内存中,这种状态就是一个双缓存异步写的操作。这样可以保证客户端写的日志时刻都能被记录下来。
2.3 SecondaryNameNode的介绍
它的作用主要有以下几点
1.备份NameNode中的元数据信息
2.提高NameNode的重启速度
3.必要的时候可作为新的NameNode
复制代码
为什么说SecondaryNameNode可以提高NameNode的恢复速度?
当集群启动的时候,会记录下启动的时间t,而随着一段时间过去后或者NameNode中的edits log文件存满后就会触发checkPoint操作,在Spark中也会有这个知识点,主要作用就是对重要的数据进行备份的一个操作
对操作步骤进行一个分点阐述方便大家阅读
1.SecondaryNameNode 会通过http get方式把edits log和fsimage的信息拉取过来
2.在SecondaryNameNode中把edits log和fsimage做一个合并,产生一个新的文件叫做fsimage.ckpt
3.在SecondaryNameNode中合并完成之后,再回传给NameNode里面
4.这时大概率会有客户端还在对NameNode进行读写操作,也会产生新的日志,会单独放在一份edits new文件中
5.刚刚回传回来的fsimage.ckpt进行分解,原本的fsimage和edits log,不过此时的edits log会把edits new中的日志文件一同合并作为完整的一份edits log文件
为什么说SecondaryNameNode可以提高NameNode的重启速度
首先搞清楚NameNode节点挂掉后它是如何进行恢复的
首先它会把内存中的镜像文件fsimage读到内存当中,然后通过edits log所记录的所有操作重新执行一遍,把所有的元数据都恢复之后,才能回到关机之前的状态,这个过程十分缓慢
但是有了SecondaryNameNode之后,通过它提供的fsimage.ckpt可以恢复很大一部分的元数据信息,再直接通过执行edits log中所记录下来的,从edits new中合并过来的新操作,就可以进行恢复
而在NameNode确定无法重启之后,SecondaryNameNode就可以通过以下命令作为新的NameNode对外提供服务
hadoop-daemon.sh start namenode
复制代码
复制代码
当然我们不难发现,这种方式非常地不优雅,因为在NameNode进行重启或者SecondaryNameNode进行上位的时间段中我们的集群肯定都会有一段空白期,hadoop HA的方式可以帮助我们解决这个问题
2.4 DataNode的介绍
存放block块,数据都是存放在DataNode上的,并且DataNode之间会备份多个副本。
DataNode启动的时候会去NameNode上注册,他俩会维持心跳,如果超过时间阈值没有收到DataNode的心跳,那HDFS就认为这个DataNode挂了。
一个Block除了存放数据的本身,还会存放一份元数据(包括数据块的长度,块数据的校验和,以及时间戳)。DataNode还是会定期向NameNode上报所有当前所有Block的信息,通过元数据就可校验当前的Block是不是正常状态。
三、HDFS机制
3.1 心跳机制
心跳机制解决了HDFS集群间的通信问题,还是NameNode命令DataNode执行操作的途径
1.master namenode启动之后,会开一个ipc server
2.slave DataNode启动,连接NameNode,每隔3s向NameNode发送一个心跳,并携带状态信息
3.NameNode通过对这个心跳的返回值来给DataNode传达任务指令
复制代码
复制代码
心跳机制的作用
1.NameNode全权管理数据块的复制,它周期性从集群中的每个DataNode接收心跳信号和块状态报告(blockReport),接收到心跳信号意味着该DataNode节点工作正常,块状态报告包含了该DataNode上所有数据块的列表
2.DataNode启动时向NameNode注册,通过后周期性地向NameNode上报blockReport,每3秒向NameNode发送一次心跳,NameNode返回对该DataNode的指令,如将数据块复制到另一台机器,或删除某个数据块等···而当某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上
3.hadoop集群刚开始启动时会进入安全模式(99.99%),就用到了心跳机制,其实就是在集群刚启动的时候,每一个DataNode都会向NameNode发送blockReport,NameNode会统计它们上报的总block数,除以一开始知道的总个数total,当 block/total < 99.99% 时,会触发安全模式,安全模式下客户端就没法向HDFS写数据,只能进行读数据。
3.2 负载均衡
其实就是节点的增加或减少,或者节点的磁盘使用率高低的问题,主要就是通过网络进行数据的迁移工作以达到高可用率
触发命令
$ HADOOP_HOME/sbin/start-balancer.sh -t 5%
复制代码
复制代码
5%其实就是刚刚提到的磁盘的利用率差值,大于5%时会触发负载均衡策略
总结
1、hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文件系统。
2、hdfs中有3个重要的模块,client对外提供统一操作接口,DataNode真正存储数据,NameNode协调和管理数据,是一个典型的master-slave架构。
3、hdfs会对大文件进行切块,并且每个切块会存储备份,保证数据的高可用,适合存储大数据。
4、NameNode通过fsimage和editlog来实现数据恢复和高可用。
5、hdfs不适用于大量小文件存储,不支持并发写入,不支持文件随机修改,查询效率大概在秒级。
参考文献: