HDFS
介绍

HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。主要由四部分组成:
- Client:就是客户端。
- NameNode:就是Master,它是一个主管、管理者。
- DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作
- SecondaryNameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
block
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。
假如存一个200M的文件,这个文件会拆成两部分:dataNode1(128M)和dataNode2(74M)
读写一个block的时候,要先寻址,然后进行数据传输,一般要求寻址时间占数据传输1%的比例,一般磁盘传输速度为100m/s,这样数据读写耗时1s,一个块在100M左右是合适的。
由于服务器就很容易出现故障,比如CPU,IO内存等等都可能会产生问题,所以block一般会存个副本,默认的副本数为3
<!--hdfs-site.xml>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
NameNode
metaData
元数据信息以命名空间镜像文件(fsimage)和编辑日志(edits log)的方式保存,两者的作用分别是:
- fsimage:元数据镜像文件,保存了文件系统目录树信息以及文件和块的对应关系;
- edits log:日志文件,保存了文件的更改记录。
Hadoop的NameNode要应对高并发,HDFS系统会收到很多文件的操作,要应对高并发场景,因此引入了日志的双缓冲机制。双缓冲机制就是指我们将会开辟两份一模一样的内存空间,一个为bufCurrent,另一个叫syncBuffer。产生的数据会直接写入bufCurrent,再在bufCurent写入的时候两片内存会发生交换,然后之前的bufCurrent就负责往磁盘上写入数据,之前的syncBuffer就继续接收客户端写入的数据。其实就是将向磁盘写数据的任务交给了后台去做。
secondary namenode
- 备份NameNode中的元数据
- 提高NameNode重启速度
- 必要的时候作为新的NameNode
当集群启动的时候,会记录下启动的时间,而随着一段时间过去后或者NameNode中的edits log文件存满后就会触发checkPoint操作,nameNode会把fsimage和edits log发给secondary namenode,secondary namenode中合并完成之后,再回传给NameNode。
NameNode节点挂掉重启后,它会把内存中的镜像文件fsimage读到内存当中,然后通过edits log所记录的所有操作重新执行一遍,把所有的元数据都恢复之后,才能回到关机之前的状态,这个过程十分缓慢。但是有了secondary namenode之后,通过它提供的fsimage.ckpt可以恢复很大一部分的元数据信息,再直接通过执行edits log中所记录下来的,从edits new中合并过来的新操作,就可以进行恢复。
而在NameNode确定无法重启之后,SecondaryNameNode就可以通过以下命令作为新的NameNode对外提供服务
hadoop-daemon.sh start namenode
但是这种方式非常地不优雅,因为在NameNode进行重启或者SecondaryNameNode进行上位的时间段中我们的集群肯定都会有一段空白期。
fsimage和Edits
namenode被格式化之后,将在/hadoop-2.7.2/data/tmp/dfs/name/current目录中产生如下文件
fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
- Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件的序列化信息。
- Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
- seen_txid文件保存的是一个数字,就是最后一个edits_的数字
每次NameNode启动的时候都会将fsimage文件读入内存,并edits里面的更新操作,保证内存中的元数据信
息是最新的、同步的,可以看成NameNode启动的时候就将fsimage和edits文件进行了合并。